![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Ученик |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 10.6.2004 Репутация: нет Всего: нет |
С Вашей помощью отыскал программу, позволяющую
вставить в нее картинку. Попробовал изменить саму картинку и размеры выводимой области – все работает. Но будучи немного знаком с процедурным программированием, ничего не понимаю в объектно-ориентированном. Как можно дописать эту программу, например, в виде диалога «Угадай, что на картинке?» с вариантами ответа, при этом если угадано правильно – вывести сообщение «Угадал» на экран и т. д.? Можно воспользоваться привычными printf, scanf, getch и т. д. или надо вставлять новые классы? В каком месте? Вот текст файла, который, как я догадываюсь, главный файл приложения. // TestBMP.cpp : Defines the class behaviors for the application. // #include "stdafx.h" #include "TestBMP.h" #include "MainFrm.h" #include "TestBMPDoc.h" #include "TestBMPView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CTestBMPApp BEGIN_MESSAGE_MAP(CTestBMPApp, CWinApp) //{{AFX_MSG_MAP(CTestBMPApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code! //}}AFX_MSG_MAP // Standard file based document commands ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) // Standard print setup command ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTestBMPApp construction CTestBMPApp::CTestBMPApp() { // TODO: add construction code here, // Place all significant initialization in InitInstance } ///////////////////////////////////////////////////////////////////////////// // The one and only CTestBMPApp object CTestBMPApp theApp; ///////////////////////////////////////////////////////////////////////////// // CTestBMPApp initialization BOOL CTestBMPApp::InitInstance() { AfxEnableControlContainer(); // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif // Change the registry key under which our settings are stored. // TODO: You should modify this string to be something appropriate // such as the name of your company or organization. SetRegistryKey(_T("Local AppWizard-Generated Applications")); LoadStdProfileSettings(); // Load standard INI file options (including MRU) // Register the application's document templates. Document templates // serve as the connection between documents, frame windows and views. CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CTestBMPDoc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CTestBMPView)); AddDocTemplate(pDocTemplate); // Parse command line for standard shell commands, DDE, file open CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // Dispatch commands specified on the command line if (!ProcessShellCommand(cmdInfo)) return FALSE; // The one and only window has been initialized, so show and update it. m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) // No message handlers //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() // App command to run the dialog void CTestBMPApp::OnAppAbout() { CAboutDlg aboutDlg; aboutDlg.DoModal(); } ///////////////////////////////////////////////////////////////////////////// // CTestBMPApp message handlers |
|||
|
||||
lynx_916 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 13.6.2004 Где: Молдова Репутация: нет Всего: 1 |
я не понял.
ты вроде для ВС31 просил. а это не для него. там булина нету, а в этом коде есть! -------------------- Who dares, wins. (с) Solid Snake |
|||
|
||||
Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: 8 Всего: 12 |
lynx_916, шутник ;) там еще и MFC нет ;)
самое веселое то, что в этом коде даже нет намека на работу с картинкой (и не должно быть т.к. это "главный файл приложения") ![]() -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
Ученик |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 10.6.2004 Репутация: нет Всего: нет |
Для BC31 я уже отыскал и все сделал (правда, цвета не совпадают,
пришлось подбирать). А данный код определяет поведение классов, в том числе и для обеспечивающего вставку картинки класса CTestBMPView, другого подобного приложения, только с MFC. Как теперь можно под картинкой напечатать вопрос и варианты ответа, организовать ввод выбранного ответа с клавиатуры и вывести сообщение о том, правильный ли выбор? |
|||
|
||||
shara |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 29.6.2004 Где: печенье? Репутация: нет Всего: 2 |
вот пример проги для BC31 которая выводит текст не как текст а как гарфику, ну как шрифты или тому подобное. прогу взял из справки по BC31 на функцию OUTTEXTXY
#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> int main(void) { /* request auto detection */ int gdriver = DETECT, gmode, errorcode; int midx, midy; /* initialize graphics and local variables */ initgraph(&gdriver, &gmode, ""); /* read result of initialization */ errorcode = graphresult(); if (errorcode != grOk) /* an error occurred */ { printf("Graphics error: %s\n", grapherrormsg(errorcode)); printf("Press any key to halt:"); getch(); exit(1); /* terminate with an error code */ } midx = getmaxx() / 2;// текст будет выведен по середине экрана midy = getmaxy() / 2; /* output text at the center of the screen */ /* Note: the C.P. doesn't get changed. */ outtextxy(midx, midy, "This is a test.");// вывод текста /* clean up */ getch(); closegraph(); return 0; } будут вопросы - пиши. пришли мне прогу при помощи которй ты картинку на экран выводишь Это сообщение отредактировал(а) shara - 29.6.2004, 13:13 -------------------- с точки зрения аэродинамики шмель не может летать |
|||
|
||||
Ученик |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 10.6.2004 Репутация: нет Всего: нет |
Это я знаю. Могу вставлять картинку, созданную в Paint размером до
800*600*24 (см. код ниже), рисовать по ней из программы, двигать эти рисунки, тем более вставлять текст с помощью outtextxy(x, y, "text"); в DOS. ------------------------------------------------------------------------------------------------ Я имел в виду объектно-ориентированное программирование (с исполь- зованием MFC) - как после вставки картинки с помощью соответствующего графического класса вставить в главный файл (см. код выше), например, текст, когда нет привычного void main(void)? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! А задаю этот вопрос потому, что болею тем же, что и ты: мало мне 16 цветов. Нижеприведенный код понимает только 16 цветов. Очень надеюсь, что кто-нибудь на форуме подкинет исходник законченной (работающей, а не фрагмент) программы, вставляющей bmp с 256 цветами и расскажет, что к чему. Может - в режиме VESA или еще как (для BC3.1). !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! [code] #include <conio.h> #include <stdio.h> #include <fcntl.h> #include <sys\stat.h> #include <io.h> #include <string.h> #include <ctype.h> #include <math.h> #include <graphics.h> unsigned long readnb(int handle,int from,int n) { int j=0; unsigned char c; unsigned long s=0; lseek(handle,from,SEEK_SET); do { read(handle,&c,1); s=s+c*pow(2,j*8); j++; }while(j<n); return(s); } int main(void) { int handle,i,bppixel,ctype,x=0,y=0; FILE *stream; unsigned char ch,r,g,b; unsigned long fsize,width,height,asize,aloc; int graphdriver=DETECT; int graphmode; initgraph(&graphdriver,&graphmode,""); clrscr(); if ((handle=open("my_pict.bmp",O_RDONLY | O_BINARY))==-1) { perror("Error"); } stream=fdopen(handle,"r+"); fsize=readnb(handle,2,4); printf("Size: %lu\n",fsize); aloc=readnb(handle,10,4); printf("Array location: %lu\n",aloc); width=readnb(handle,18,4); printf("Width: %lu\n",width); height=readnb(handle,22,4); printf("Height: %lu\n",height); bppixel=readnb(handle,28,2); printf("Bit per pixel: %u\n",bppixel); ctype=readnb(handle,30,4); printf("Compression type: %u\n",ctype); asize=readnb(handle,34,4); printf("Array size: %lu\n",asize); getch(); lseek(handle,aloc,SEEK_SET); cleardevice(); y=height; do { read(handle,&r,1); read(handle,&g,1); read(handle,&b,1); putpixel(x,y,((r+g+b)/51)); x++; if (x==width) { x=0; y--; } //getch(); }while(!eof(handle)); fclose(stream); close(handle); getch(); closegraph(); } |
|||
|
||||
shara |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 29.6.2004 Где: печенье? Репутация: нет Всего: 2 |
ну понятно. спасибо за прогу(хоть что-то
![]() ![]() -------------------- с точки зрения аэродинамики шмель не может летать |
|||
|
||||
Конструктор |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 641 Регистрация: 12.5.2004 Где: Москва Репутация: нет Всего: 10 |
||||
|
||||
Ученик |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 10.6.2004 Репутация: нет Всего: нет |
Лично мне это нравится. Распечатал на бумажку, изучаю.
Надеюсь, настанет время - оценю это по достоинству и задам кучу вопросов. Один уже есть. Попробовал с файлами .mtx, .pal, pic. А как с другими типами? Отсканировал свою фотку в bmp и хочу к ней пририсовать кое-что и вставить в программу. Можно это сделать в MTX_EDIT? Как это конвертируется? Моя bmp не захотела никуда вставляться. |
|||
|
||||
Конструктор |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 641 Регистрация: 12.5.2004 Где: Москва Репутация: нет Всего: 10 |
В идеале надо просто написать конвертер из бмп в mtx, или pic. MTX_EDIT бесконечно убог для серъезных рисунков.
Форматы просты до безобразия: mtx - 2 байта - ширина,2 байта высота (в пикселах), затем построчно собственно битовая карта размером ширина * высота байт. pic - несколько mtx скрепленных вместе последовательно (т.е. например операцией merge из norton) для более удобной работы с анимацией и уменьшения незаполненных кластеров. pal - так как все файлы хранят только 256 цветные рисунки (1 байт на пиксел) для их корректного отображения необходима палитра. (Редактор PAL_EDIT) Каждый байт в 256 цветном растре указывает какой цвет из палитры необхождимо применить для вывода этого байта на экран. Палитра это 768 (256 * 3)байт с данными о 256 цветах по каналам (красный-зеленый-синий (RGB)). Т.е. первая тройка байт кодирует первый цвет (атрибут), и т.д. "Формат" был очень распространен в эпоху досовских игр, из которых можно этих палитр навыдергивать. Вообще вся эта белиберда в первую очередь для разработки "игр", коих несколько штук имеется. |
|||
|
||||
Ученик |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 10.6.2004 Репутация: нет Всего: нет |
Как можно дополнить этот код, чтобы вставить в программу из файла
bmp 640*480*256 цветов? [code] #include <conio.h> #include <dos.h> #include <process.h> #include <stdio.h> #include <string.h> #include "myvesa.h" #define LOWORD(l) ((int)(l)) #define HIWORD(l) ((int)((l)>>16)) static int curBank =0; static int granularity=1; static VESAModeInfo curMode; int findVESA(VESAInfo& vi) { #if defined(__COMPACT__)||defined(__LARGE__)||defined(__HUGE__) asm{ push es push di les di,dword ptr vi mov ax,4F00h int 10h pop di pop es } #else asm{ push di mov di,word ptr vi mov ax,4F00h int 10h pop di } #endif if(_AX != 0x004F) return 0; return !strncmp(vi.sign,"VESA",4); } int findVESAMode(int mode, VESAModeInfo& mi) { #if defined(__COMPACT__)||defined(__LARGE__)||defined(__HUGE__) asm{ push es push di les di,dword ptr mi mov ax,4F01h mov cx, mode int 10h pop di pop es } #else asm{ push di move di,word ptr mi mov ax,4F01h mov cx,mode int 10h pop di } #endif return _AX==0x004F; } int setVESAMode(int mode) { if(!findVESAMode(mode,curMode)) return 0; granularity=64/curMode.winGranularity; asm{ mov ax,4F02h mov bx,mode int 10h } return _AX==0x004F; } int getVESAMode() { asm{ mov ax,4F03h int 10h } if(_AX!=0x004F) return 0; else return _BX; } void setVESABank(int start) { if(start==curBank) return; curBank=start; start *=granularity; asm{ mov ax,4F05h mov bx,0 mov dx,start push dx int 10h mov bx,1 pop dx int 10h } } void writePixel(int x,int y,int color) { long addr=(long)curMode.bytesPerScanLine*(long)y+(long)x; setVESABank(HIWORD(addr)); pokeb(0xA000,LOWORD(addr),color); } void main() { VESAInfo vi; if(!findVESA(vi)) { printf("\nVESA VBE not found."); exit( 1 ); } if(!setVESAMode(VESA_640x480x256)) exit( 1 ); for(int i=0;i<640;i++) for(int j=0;j<480;j++) writePixel(i,j,((i/20)+1)*(j/20+1)); getch(); } |
|||
|
||||
shara |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 29.6.2004 Где: печенье? Репутация: нет Всего: 2 |
я хочю сказать только одно, ты когда инициализируешь графику то ты ОПЯТЬЖЕ используешь 16 цветов и поэтому нарисовать bmp в 256 цветов будет очень проблематично
![]() ![]() Это сообщение отредактировал(а) shara - 3.7.2004, 07:13 -------------------- с точки зрения аэродинамики шмель не может летать |
|||
|
||||
Ученик |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 10.6.2004 Репутация: нет Всего: нет |
Будь так добр - покажи.
|
|||
|
||||
Artem13 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 5.7.2004 Репутация: нет Всего: нет |
Ученик
shara Ребята, вам не надоело ДОС мучить? Мож под винды чёнить, а? |
|||
|
||||
Ученик |
|
|||
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 10.6.2004 Репутация: нет Всего: нет |
У тебя есть, что показать?
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |