Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Boriss
Статус: Академик
Рейтинг: 2544
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2033
∙ повысить рейтинг »
vladisslav
Статус: 8-й класс
Рейтинг: 1322
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска: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 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.23 от 23.11.2010

    В избранное