Консультация № 180909
23.11.2010, 18:07
0.00 руб.
0 4 1
Здравствуйте, уважаемые эксперты! Помогите вставить 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
успехов не приносит.



Приложение:
;Код основной программы:
.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\comdlg32.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

.data
cb1 dd 0 ; 3 Check boxes
cb2 dd 0
cb3 dd 0

.data?
hInstance dd ? ;описатель экземпляра процесса
CommandLine dd ? ;командная строка
hIcon dd ? ;описатель пиктограммы
hCursor dd ? ;описатель курсора
hWnd dd ? ;описатель главного окна приложения
hBitMap dd ? ;описатель растрового изображения
hMemDC 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 [hMemDC] != 0
invoke DeleteDC, [hMemDC] ;освободим ресурсы, если надо
.endif
invoke PostQuitMessage,NULL
return 0
Endsw
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
WndProc endp

PSDialog1 proc
xor eax,eax
ret
PSDialog1 endp
PSDialog2 proc
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 [PSHeader.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-ая страница << << << << << << << << << << << << << << << <<
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

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 "Second Page"
STYLE WS_POPUP | WS_CAPTION | WS_VISIBLE
BEGIN
DEFPUSHBUTTON "Invert", IDD_BUTTON_2, 220, 120, 32, 14,
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

Обсуждение

давно
Посетитель
7438
7205
24.11.2010, 03:34
общий
это ответ
Здравствуйте, 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\comdlg32.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 [PSHeader.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-ая страница << << << << << << << << << << << << << << << <<
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 "Second Page"
STYLE WS_POPUP | WS_CAPTION | WS_VISIBLE
BEGIN
DEFPUSHBUTTON "Invert", IDD_BUTTON_2, 220, 120, 32, 14,
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

5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
24.11.2010, 14:22
общий
Адресаты:
Спасибо за ответ!
Не знаю, насколько это правильно, но я поместил для вывода текста только один вызов invoke DrawText между invoke BitBlt и invoke EndPaint:
invoke BitBlt,hdc,eax,0,rect.right,rect.bottom,hMemDC1,0,0,SRCCOPY
invoke DrawText, hdc,ADDR OurText,-1, ADDR rect,NULL
invoke EndPaint,hWin,addr ps
И чтобы текст размещался не в белом прямоугольнике, а на фоне окна, добавил ещё две функции invoke GetSysColor и invoke SetBkColor. Но это работает, когда текст находится левее изображения. Если изображение в окне слева, а текст справа, то через всё изображение проходит полоса фона. А можно это побороть?
давно
Посетитель
7438
7205
24.11.2010, 14:55
общий
Попробуйте задать так:
В PSDialog1:
Код:

Case WM_PAINT
invoke BeginPaint,hWin,addr ps
mov hdc,eax
invoke GetClientRect,hWin,addr rect
mov eax,rect.right
shr eax,1
mov rect.left, eax
invoke BitBlt,hdc,eax,20,rect.right,rect.bottom,hMemDC1,0,0,SRCCOPY

invoke SetBkMode, hdc, TRANSPARENT
invoke DrawText, hdc,ADDR OurText,-1, ADDR rect,NULL

invoke EndPaint,hWin,addr ps
В PSDialog2:
Код:

Case WM_PAINT
invoke BeginPaint,hWin,addr ps
mov hdc,eax
invoke GetClientRect,hWin,addr rect
mov eax,rect.right
shr eax,1
mov rect.right, eax
invoke BitBlt,hdc,0,20,rect.right,rect.bottom,hMemDC2,0,0,SRCCOPY

invoke SetBkMode, hdc, TRANSPARENT

invoke DrawText, hdc,ADDR OurText,-1, ADDR rect,NULL

invoke EndPaint,hWin,addr ps
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
26.11.2010, 09:30
общий
Адресаты:
Разобрался со шрифтами, спасибо!
Но почему-то не получается обработать edit, чтобы перейти на другую страницу. В простом окне всё получалось: при неправильном вводе при нажатии на ОК выскакивало окошко с предупреждением, при правильном программа закрывалась. Сейчас в диалоговых окнах при неправильном вводе выскакивает предупреждение, но переход на следующую страницу происходит в любом случае, что мне ненужно. При правильном вводе никакого сообщения не показывается, как и должно быть, но и автоматического перехода на следующую страницу не происходит. Я пытался обрабатывать кнопку ОК, а не Далее, т.к. не знаю алгоритма обработки Далее по определённому условию. Возможно, для Далее в сообщении WM_NOTIFY нужно ставить код извещения PSN_KILLACTIVE.
Я обрабатывал свою кнопку вот так:
.ELSEIF eax==WM_COMMAND
LOWORD wParam
.IF ax==IDD_BUTTON_1 ;если кнопка
shr eax,16
.IF ax==BN_CLICKED ;и она нажата
invoke GetDlgItemText, hWin, IDC_EDIT_1, ADDR buffer, 512 ;то копируем из EDIT в буфер
invoke lstrcmpi, addr buffer, addr Answer ;и сравним
.IF eax==0 ;если равно
xor eax,eax ;то на следующее
ret ;диалоговое окно
.ENDIF
invoke MessageBox,NULL,ADDR String,ADDR String,MB_OK ; или предупреждение
.ENDIF
...
xor eax,eax
ret
PSDialog1 endp
Подскажите, как мне перейти на другую страницу при правильном заполнении edit и нажатии на Далее? Вариант с ОК, как я понял, бесперспективный.
Форма ответа