Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты данной рассылки Номер выпуска: | 1387 | Дата выхода: | 28.11.2010, 18:30 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 221 / 67 | Вопросов / ответов: | 1 / 1 | Вопрос № 180909: Здравствуйте, уважаемые эксперты! Помогите вставить 2 небольших файла с расширением .bmp в окна. Один файл с названием, например, 1.bmp вставляется в правую половину первого окна, а файл 2.bmp вставляется в левую половину второго окна. Желательно ещё... Вопрос № 180909: Здравствуйте, уважаемые эксперты! Помогите вставить 2 небольших файла с расширением .bmp в окна. Один файл с названием, например, 1.bmp вставляется в правую половину первого окна, а файл 2.bmp вставляется в левую половину второго окна. Желательно ещё вывести под или над каждым вставляемым файлом пояснительное предложение, вроде, «это круг» или «это прямоугольник». Мой вариант со вставкой в функции, оформленных в виде процедур PSDialog1 и PSDialog2, стандартного кода для вывода bmp: .if uMsg==WM_CREATE invoke LoadBitmap,hInstance,IDB_MAIN mov hBitmap,eax .elseif uMsg==WM_PAINT invoke BeginPaint,hWnd,addr ps mov hdc,eax invoke CreateCompatibleDC,hdc mov hMemDC,eax invoke SelectObject,hMemDC,hBitmap invoke GetClientRect,hWnd,addr rect invoke BitBlt,hdc,0,0,rect.right,rect.bottom,hMemDC,0,0,SRCCOPY invoke DeleteDC,hMemDC invoke EndPaint,hWnd,addr ps успехов не при носит.
Отправлен: 23.11.2010, 18:07 Вопрос задал: Adsorores (Посетитель) Всего ответов: 1 Страница вопроса » Отвечает Лысков Игорь Витальевич (Старший модератор) : Здравствуйте, Adsorores! Главная ошибка - в диалогах, а именно они используются в PropertySheet, при создании надо отрабатывать не WM_CREATE, a WM_INITDIALOG Не забывайте освобождать ресурсы... Можно и как я сделал (в отработке WM_DESTROY основного окна), и в отработке PSPCB_RELEASE Callback-функции страницы (в нашем случае ее нет). Второй способ,я считаю, более правильный, т.к. PropertySheet-ов может быть много, и хранить, по сути, ненужные ресурсы до выхода из программы не очень правильно PS Не забудьте добавить две BMP-шки: 1.bmp и 2.bmp PSS С надписью думаю сами справитесь...
Код: ;Код основной программы: .386 .model flat, stdcall option casemap :none
include \masm32\include\windows.inc include \masm32\include\masm32.inc include \masm32\include\gdi32.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\Comctl32.inc include \masm32\include\comdlg32.inc include \masm32\include\shell32.inc include \masm32\include\oleaut32.inc include \masm32\include\msvcrt.inc include \masm32\macros\macros.asm
includelib \masm32\lib\masm32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\Comctl32.lib includelib \masm32\lib\c omdlg32.lib includelib \masm32\lib\shell32.lib includelib \masm32\lib\oleaut32.lib includelib \masm32\lib\msvcrt.lib
; Прототипы функций WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD RegisterWinClass PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD MsgLoop PROTO Main PROTO
;коды используемых ресурсов IDD_BUTTON_1 EQU 205 IDD_BUTTON_2 EQU 207
IDD_CB1 EQU 501 IDD_CB2 EQU 502 IDD_CB3 EQU 503
IDD_DLG1 equ 101 IDD_DLG2 equ 102
IDC_EDIT_1 equ 301
IDB_MAIN1 equ 601 IDB_MAIN2 equ 602
.data cb1 dd 0 ; 3 Check boxes cb2 dd 0 cb3 dd 0
.data? hInstance dd ? ;описатель экземпляра процесса CommandLine dd ? ;командная строка hIcon dd ? ;описатель пиктограммы hCursor dd ? ;описатель курсора hWnd dd ? ;описатель главного окна приложения hBitmap1 dd ? ;описатель растрового изображения hMemDC1 dd ? ;описа тель совместимого контекста устройства (DC) hBitmap2 dd ? ;описатель растрового изображения hMemDC2 dd ? ;описатель совместимого контекста устройства (DC) PSHeader PROPSHEETHEADERA <> ;заголовок PropertySheet PSPages PROPSHEETPAGE <> ;страницы PropertySheet PROPSHEETPAGE <>
.code start: mov hInstance, rv(GetModuleHandle, NULL) ;описатель экземпляра процесса mov CommandLine, rv(GetCommandLine) ;командная строка mov hIcon, rv(LoadIcon,hInstance,NULL) ;пиктограмма mov hCursor, rv(LoadCursor,NULL,IDC_ARROW) ;курсор call Main ;запускаем invoke ExitProcess,eax ;завершаем процесс ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« Main proc STRING szClassName,"PropertyDialog_Class" ;класс основного окна invoke RegisterWinClass,ADDR WndProc,ADDR szClassName, ;регистрируем класс окна hIcon,hCursor,COLOR_BTNFACE+1 ;создаем основное окно invoke CreateWindowEx,WS_EX_LEFT,\ ADDR szClassName,\ NULL,\ WS_CAPTION or WS_THICKFRAME or WS_MINIMIZEBOX,\ 10,10,450,250,\ NULL,NULL,\ hInstance,NULL mov hWnd,eax ;сохраним описатель окна invoke ShowWindow,hWnd, SW_SHOWNORMAL ;показать invoke UpdateWindow,hWnd ;обновить call MsgLoop ;основной цикл обработки сообщений ret Main endp
;регистрируем класс окна RegisterWinClass proc lpWndProc:DWORD, lpClassName:DWORD,\ Icon:DWORD, Cursor:DWORD, bColor:DWORD
LOCAL wc:WNDCLASSEX mov wc.cbSize, sizeof WNDCLASSEX mov wc.style, CS_BYTEALIGNCLIENT or CS_BYTEALIGNWINDOW m2m wc.lpfnWndProc, lpWndProc mov wc.cbClsExtra, NULL mov wc.cbWndExtra, NULL m2m wc.hInstance, hInstance m2m wc.hbrBackground, bColor mov wc.lpszMenuName, NULL m2m wc.lpszClassName, lpClassName m2m wc.hIcon, Icon m2m wc.hCursor, Cursor m2m wc.hIconSm, Icon invoke RegisterClassEx, ADDR wc ret RegisterWinClass endp
;цикл обработки сообщений MsgLoop proc uses esi edi LOCAL msg:MSG xor edi, edi lea esi, msg jmp jumpin StartLoop: invoke TranslateMessage, esi invoke DispatchMessage, esi jumpin: invoke GetMessage,esi,edi,edi,edi test eax, eax jnz StartLoop mov eax, msg.wParam ret MsgLoop endp
;функция основного окна WndProc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD Switch uMsg Case WM_CREATE call Properties ;создаем PropertySheet invoke SendMessage,[hWin],WM_CLOSE,0,0 ;выйдя из propertysheet, сразу завершаемся return 0 Case WM_DESTROY .if [hMemDC1] != 0 invoke DeleteDC, [hMemDC1] ;освободим ресурсы, если надо .endif .if [hBitmap1] != 0 invoke DeleteObject,hBitmap1 .endif .if [hMemDC2] != 0 invoke DeleteDC, [hMemDC2] ;освободим ресурсы, если надо .endif .if [hBitmap2] != 0 invoke DeleteObject,hBitmap2 .endif invoke PostQuitMessage,NULL return 0 Endsw invoke DefWindowProc,hWin,uMsg,wParam,lParam ret WndProc endp
PSDialog1 proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD LOCAL hdc:HDC LOCAL ps:PAINTSTRUCT LOCAL rect:RECT Switch uMsg Case WM_INITDIALOG invoke LoadBitmap,hInstance,IDB_MAIN1 mov hBitmap1,eax invoke GetDC,hWin mov hdc,eax invoke CreateCompatibleDC,hdc mov hMemDC1,eax invoke SelectObject,hMemDC1,hBitmap1 invoke ReleaseDC,hWin,hdc Case WM_PAINT invoke BeginPaint,hWin,addr ps mov hdc,eax invoke GetClientRect,hWin,addr rect mov eax,rect.right shr eax,1 invoke BitBlt,hdc,eax,0,rect.right,rect.bottom,hMemDC1,0,0,SRCCOPY invoke EndPaint,hWin,addr ps Endsw xor eax,eax ret PSDialog1 endp PSDialog2 proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD LOCAL hdc:HDC LOCAL ps:PAINTSTRUCT LOCAL rect:RECT Switch uMsg Case WM_INITDIALOG invoke LoadBitmap,hInstance,IDB_MAIN2 mov hBitmap2,eax invoke GetDC,hWin mov hdc,eax invoke CreateCompatibleDC,hdc mov hMemDC2,eax invoke SelectObject,hMemDC2,hBitmap2 invoke ReleaseDC,hWin,hdc Case WM_PAINT invoke BeginPaint,hWin,addr ps mov hdc,eax invoke GetClientRect,hWin,addr rect invoke BitBlt,hdc,0,0,rect.right,rect.bottom,hMemDC2,0,0,SRCCOPY invoke EndPaint,hWin,addr ps Endsw xor eax,eax ret PSDialog2 endp ;< < << << << << << << << << << << << << << << << ; << << << << << << << << << ;создание PropertySheet Properties proc uses ebx ;заполняем структуры xor eax, eax mov edx, [hWnd] mov ebx, [hInstance] lea ecx, PSPages ;<< << << << << << Заголовок << << << << << << << << << << << << << << << << mov [PSHeader.dwSize], size PROPSHEETHEADERA mov [PSHeader.dwFlags], PSH_NOAPPLYNOW+PSH_PROPSHEETPAGE+PSH_WIZARD mov [PSHeader.hwndParent], edx mov [PSHeader.hInstance], ebx m2m [PSHeader.hIcon], NULL mov [PSHeader.pszCaption], NULL mov [PSHeader.nPages], 2 ;2 страницы mov [PSHeader.nStartPage], eax ;стартовая - первая mov [PSHeader.ppsp], ecx mov [PSHeader.pfnCallback], eax mov [PSHeader.hbmWatermark], eax mov [PSHeader.hplWatermark], eax mov [PSHe ader.hbmHeader], eax ;<< << << << << << 1-ая страница << << << << << << << << << << << << << << << << mov [(PROPSHEETPAGE ptr [ecx]).dwSize], size PROPSHEETPAGE mov [(PROPSHEETPAGE ptr [ecx]).dwFlags], PSP_DEFAULT + PSP_HIDEHEADER mov [(PROPSHEETPAGE ptr [ecx]).hInstance], ebx mov [(PROPSHEETPAGE ptr [ecx]).pResource], IDD_DLG1 ;имя диалога в ресурсах mov [(PROPSHEETPAGE ptr [ecx]).hIcon], eax mov [(PROPSHEETPAGE ptr [ecx]).pszTitle], eax mov [(PROPSHEETPAGE ptr [ecx]).pfnDlgProc], PSDialog1 ;функция окна mov [(PROPSHEETPAGE ptr [ecx]).lParam], eax mov [(PROPSHEETPAGE ptr [ecx]).pfnCallback], eax mov [(PROPSHEETPAGE ptr [ecx]).pcRefParent], eax ;<< << << << << << 2-ая страница << << << << << << << << << <& lt; << << << << << << add ecx, size PROPSHEETPAGE mov [(PROPSHEETPAGE ptr [ecx]).dwSize], size PROPSHEETPAGE mov [(PROPSHEETPAGE ptr [ecx]).dwFlags], PSP_DEFAULT + PSP_HIDEHEADER mov [(PROPSHEETPAGE ptr [ecx]).hInstance], ebx mov [(PROPSHEETPAGE ptr [ecx]).pResource], IDD_DLG2 ;имя диалога в ресурсах mov [(PROPSHEETPAGE ptr [ecx]).hIcon], eax mov [(PROPSHEETPAGE ptr [ecx]).pszTitle], eax mov [(PROPSHEETPAGE ptr [ecx]).pfnDlgProc], PSDialog2 ;функция окна mov [(PROPSHEETPAGE ptr [ecx]).lParam], eax mov [(PROPSHEETPAGE ptr [ecx]).pfnCallback], eax mov [(PROPSHEETPAGE ptr [ecx]).pcRefParent], eax
invoke PropertySheet, addr PSHeader ;создаем и "сидим" в нем, пока не выйдем ret Properties endp end start rsrc.rcКод: #include "\masm32\include\resource.h" #define IDD_DLG1 101 #define IDD_DLG2 102 #define IDC_EDIT_1 301 #define IDD_BUTTON_1 205 #define IDD_BUTTON_2 207 #define IDD_CB1 501 #define IDD_CB2 502 #define IDD_CB3 503 #define IDB_MAIN1 601 #define IDB_MAIN2 602
IDB_MAIN1 BITMAP MOVEABLE PURE "1.BMP" IDB_MAIN2 BITMAP MOVEABLE PURE "2.BMP" IDD_DLG1 DIALOG 10, 10, 450, 250 CAPTION "First Page" STYLE WS_POPUP | WS_CAPTION | WS_VISIBLE BEGIN EDITTEXT ,IDC_EDIT_1,20,70,90,12, ES_AUTOHSCROLL | ES_LEFT | WS_TABSTOP DEFPUSHBUTTON "OK", IDD_BUTTON_1, 45, 95, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP END
IDD_DLG2 DIALOG 10, 10, 450, 250 CAPTION "Seco nd Page" STYLE WS_POPUP | WS_CAPTION | WS_VISIBLE BEGIN DEFPUSHBUTTON "Invert", IDD_BUTTON_2, 220, 120, 32, 1 4, WS_CHILD | WS_VISIBLE | WS_TABSTOP AUTOCHECKBOX "Check Box 1", IDD_CB1, 220, 30, 70, 10 AUTOCHECKBOX "Check Box 2", IDD_CB2, 220, 60, 70, 10 AUTOCHECKBOX "Check Box 3", IDD_CB3, 220, 90, 70, 10 END ----- Люби своего ближнего, как самого себя Ответ отправил: Лысков Игорь Витальевич (Старший модератор) Ответ отправлен: 24.11.2010, 03:34 Номер ответа: 264302 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru
Оценка ответа: 5 Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"? | Отправить SMS #thank 264302 на номер 1151 (Россия) | Еще номера » | Оценить выпуск » Нам очень важно Ваше мнение об этом выпуске рассылки! Скажите "спасибо" эксперту, который помог Вам! Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА на короткий номер 1151 (Россия) Номер ответа и конкретный текст СМС указан внизу каждого ответа. Полный список номеров » * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов) ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются. *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании. |
Комментариев нет:
Отправить комментарий