· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› FASM и элементы окна

Посл.отвђт Сообщенiе


Дата: Ноя 13, 2003 10:48:26

Приветствую!
Народ, помогите разобраться.
В FASMе все элементы окна должны создаваться через диалоги и обрабатываться в WM_COMMAND?
У меня не получилось создать кнопку через CreateWindowEx.


Дата: Ноя 13, 2003 12:36:56

Должно работать. Хотя мелкомягкие рекомендуют именно через ресурсы.


Дата: Ноя 13, 2003 20:13:05

В ФАСМе как и в ТАСМЕ и МАСМе. Исходник пожалуйста.


Дата: Ноя 13, 2003 21:19:18 · Поправил: 640kb

include 'include\win32ax.inc'
BUTTON_ID = 101

.data
 _WindowClass db 'SHIT',0
 _ButtonClass db 'BUTTON',0
 mainHwnd dd ?
 hInstance dd ?
 hwnd_BUTTON dd ?
 msg MSG
 wc WNDCLASS

.code
start:
 invoke GetModuleHandle, 0
 mov [hInstance], eax
 invoke LoadIcon, 0, IDI_APPLICATION
 mov [wc.hIcon], eax
 invoke LoadCursor, 0, IDC_ARROW
 mov [wc.hCursor], eax
 mov [wc.style], 0
 mov [wc.lpfnWndProc], WindowProc
 mov [wc.cbClsExtra], 0
 mov [wc.cbWndExtra], 0
 mov eax, [hInstance]
 mov [wc.hInstance], eax
 mov [wc.hbrBackground], COLOR_BTNFACE+1
 mov [wc.lpszMenuName], 0
 mov [wc.lpszClassName], _WindowClass
 invoke RegisterClass, wc

 invoke CreateWindowEx, 0, _WindowClass, 0, WS_SYSMENU+WS_MINIMIZEBOX, \
 100, 100, 300, 300, 0, 0, [hInstance], 0
 mov [mainHwnd],eax
 invoke ShowWindow, [mainHwnd], SW_SHOWNORMAL
 invoke UpdateWindow, [mainHwnd]

msg_loop:
 invoke GetMessage, msg, 0, 0, 0
 .if eax,e,0
  invoke ExitProcess, [msg.wParam]
 .endif
 invoke TranslateMessage, msg
 invoke DispatchMessage, msg
 jmp msg_loop


proc WindowProc, hwnd, wmsg, wparam, lparam
enter
push ebx esi edi

 .if [wmsg],e,WM_DESTROY
  invoke PostQuitMessage, 0

 .elseif [wmsg],e,WM_CREATE
  invoke CreateWindowEx, 0, _ButtonClass, 'button', \
  WS_CHILD+WS_VISIBLE+BS_FLAT+WS_TABSTOP, 100, 100, 60 ,20 , [mainHwnd], \
  BUTTON_ID, [hInstance], 0
  mov [hwnd_BUTTON], eax

 .elseif [wmsg],e,WM_COMMAND
  .if [wparam],e,BN_CLICKED shl 16+BUTTON_ID
   invoke DestroyWindow, [mainHwnd]
  .endif

 .else
  invoke DefWindowProc, [hwnd], [wmsg], [wparam], [lparam]
  return
 .endif
 xor eax, eax
 pop edi esi ebx
 return
.end start


Дата: Ноя 13, 2003 21:39:35

1. Замените [mainHwnd] на [hwnd] и помедитируйте.
2. WS_TABSTOP всё равно ничего не делает и можно убрать.


Дата: Ноя 13, 2003 23:06:08

2 Quantum:
WS_TABSTOP - работает если использовать SubClassing!

format PE GUI 4.0
entry start

include '%include%\win32a.inc'

section '.data' data readable writeable

_title db 'TP on Flat Assembler by x-sgg',0
_class db 'DPRS_class',0
_edit db 'EDIT',0
_bt db 'BUTTON',0
_ch db 'Check',0
_fr db '%d : %d : %d',0
_tm rb 40h

ints dd ?
intd dd ?
mainhwnd dd ?
hinstance dd ?
oldproc dd ?
oldproc2 dd ?

msg MSG
wc WNDCLASS

proc g_reg
enter
jmp @F
_fr2 db 'EAX: %u',13,10,\
'EDX: %u',13,10,\
'ECX: %u',13,10,\
'EBX: %u',13,10,\
'EBP: %u',13,10,\
'ESI: %u',13,10,\
'EDI: %u',13,10,\
'ESP: %u',0
tmp3 rb 100
@@:
push eax
invoke wsprintf,tmp3,_fr2,eax,edx,ecx,ebx,ebp,esi,edi,esp
invoke MessageBox,0,tmp3,0, MB_OK + MB_ICONERROR
pop eax
return

section '.code' code readable executable

start:

invoke GetModuleHandle,0
mov [hinstance],eax
invoke LoadIcon,0,IDI_APPLICATION
mov [wc.hIcon],eax
invoke LoadCursor,0,IDC_ARROW
mov [wc.hCursor],eax
mov [wc.style],0
mov [wc.lpfnWndProc],WindowProc
mov [wc.cbClsExtra],0
mov [wc.cbWndExtra],0
mov eax,[hinstance]
mov [wc.hInstance],eax
mov [wc.hbrBackground],COLOR_BTNFACE+1
mov [wc.lpszMenuName],0
mov [wc.lpszClassName],_class
invoke RegisterClass,wc

invoke CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,1 28,292,192,NULL,NULL,[hinstance],NULL
mov [mainhwnd],eax
invoke CreateWindowEx,WS_EX_CLIENTEDGE,_edit,NULL,WS_VISIBLE+WS_CHILD+ES_AUTO VSCROLL+WS_TABSTOP,1,1,170,23,[mainhwnd],1,0,NULL
invoke CreateWindowEx,0,_bt,_ch,WS_VISIBLE+WS_CHILD+WS_TABSTOP,172,1,70,23,[m ainhwnd],2,0,NULL
invoke CreateWindowEx,0,_bt,_ch,WS_VISIBLE+WS_CHILD+WS_TABSTOP,172,24,70,23,[ mainhwnd],3,0,NULL
invoke CreateWindowEx,0,_bt,_ch,WS_VISIBLE+WS_CHILD+WS_TABSTOP,1,24,70,23,[ma inhwnd],4,0,NULL
; Цикл по устоновке шрифров на компоненты
invoke GetDlgItem,[mainhwnd],1
invoke SetWindowLong,eax,GWL_WNDPROC,SubProc
mov [oldproc],eax
invoke GetDlgItem,[mainhwnd],2
invoke SetWindowLong,eax,GWL_WNDPROC,SubProc
mov [oldproc2],eax
invoke GetDlgItem,[mainhwnd],3
invoke SetWindowLong,eax,GWL_WNDPROC,SubProc
invoke GetDlgItem,[mainhwnd],4
invoke SetWindowLong,eax,GWL_WNDPROC,SubProc
mov ecx,4
cycl:
push ecx
jcxz msg_loop
invoke GetStockObject,DEFAULT_GUI_FONT
pop ecx
push ecx eax
invoke GetDlgItem,[mainhwnd],ecx
pop edx
invoke SendMessage,eax,WM_SETFONT,edx,NULL
pop ecx
dec ecx
jmp cycl
; Конец цикла

msg_loop:
invoke GetMessage,msg,NULL,0,0
or eax,eax
jz end_loop
invoke TranslateMessage,msg
invoke DispatchMessage,msg
jmp msg_loop

end_loop:
invoke ExitProcess,[msg.wParam]

proc WindowProc, hwnd,wmsg,wparam,lparam
enter
push ebx esi edi
cmp [wmsg],WM_DESTROY
je wmdestroy
cmp [wmsg],WM_COMMAND
je wmcommand
cmp [wmsg],WM_CREATE
je wmcreate
defwndproc:
invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
jmp finish
wmcreate:


jmp finish
wmdestroy:
invoke PostQuitMessage,0
xor eax,eax
jmp finish
wmcommand:
cmp [wparam],2
jne finish

;mov [ints+4],1234567890
;mov eax, [ints-4]

;invoke wsprintf,_tm,_fr,[ints],[intd], eax
;invoke GetDlgItem,[mainhwnd],1
;invoke SetWindowText,eax,_tm

; call g_reg
xor eax,eax
finish:
pop edi esi ebx
return

proc SubProc, hwnd,wmsg,wparam,lparam
enter

cmp [wmsg],WM_CHAR
jne default
cmp byte[wparam],9
jne default
invoke GetNextDlgTabItem,[mainhwnd],[hwnd],0
invoke SetFocus,eax
jmp fsh
default:
invoke GetDlgCtrlID,[hwnd]
cmp eax,1
jne @F
invoke CallWindowProc,[oldproc],[hwnd],[wmsg],[wparam],[lparam]
jmp fsh
@@:
invoke CallWindowProc,[oldproc2],[hwnd],[wmsg],[wparam],[lparam]
fsh:
return

section '.idata' import data readable writeable

library kernel,'KERNEL32.DLL',\
user,'USER32.DLL',\
gdi,'GDI32.DLL'

import kernel,\
GetModuleHandle,'GetModuleHandleA',\
ExitProcess,'ExitProcess'

import user,\
RegisterClass,'RegisterClassA',\
CreateWindowEx,'CreateWindowExA',\
DefWindowProc,'DefWindowProcA',\
GetMessage,'GetMessageA',\
TranslateMessage,'TranslateMessage',\
DispatchMessage,'DispatchMessageA',\
LoadCursor,'LoadCursorA',\
LoadIcon,'LoadIconA',\
PostQuitMessage,'PostQuitMessage',\
GetDlgItem,'GetDlgItem',\
SendMessage,'SendMessageA',\
GetDlgItemText,'GetDlgItemTextA',\
SetWindowText,'SetWindowTextA',\
wsprintf,'wsprintfA',\
SetWindowLong,'SetWindowLongA',\
MessageBox,'MessageBoxA',\
CallWindowProc,'CallWindowProcA',\
PostMessage,'PostMessageA',\
GetNextDlgTabItem,'GetNextDlgTabItem',\
SetFocus,'SetFocus',\
GetDlgCtrlID,'GetDlgCtrlID'


import gdi,\
GetStockObject,'GetStockObject'


Дата: Ноя 13, 2003 23:11:47 · Поправил: Quantum

Songoku
Так я про тот предыдущий код писал, что не работает. Кстати, знаете что будет если применить WS_TABSTOP ко всплывающему или overlapped окну? :-)


Дата: Ноя 13, 2003 23:41:30 · Поправил: 640kb

WS_TABSTOP остался от проги на MASMе (ctrl+c, ctrl+v)
Quantum Спасибо! У меня как всегда ошибки из-за невнимательности.


Дата: Ноя 14, 2003 15:49:10

Quantum ... не чего не будет! :-)
Ты мне лутше скажи как делаются hint на API


Дата: Ноя 14, 2003 16:01:25

Songoku
Ты мне лутше скажи как делаются hint на API
Ну, если поможет:
/* CREATE A TOOLTIP CONTROL OVER THE ENTIRE WINDOW AREA */
void CreateMyTooltip (HWND hwnd)
{
                 // struct specifying control classes to register
    INITCOMMONCONTROLSEX iccex; 
    HWND hwndTT;                 // handle to the ToolTip control
          // struct specifying info about tool in ToolTip control
    TOOLINFO ti;
    unsigned int uid = 0;       // for ti initialization
    char strTT[30] = "This is your ToolTip string.";
    LPTSTR lptstr = strTT;
    RECT rect;                  // for client area coordinates

    /* INITIALIZE COMMON CONTROLS */
    iccex.dwICC = ICC_WIN95_CLASSES;
    iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
    InitCommonControlsEx(&iccex);
	
    /* CREATE A TOOLTIP WINDOW */
    hwndTT = CreateWindowEx(WS_EX_TOPMOST,
        TOOLTIPS_CLASS,
        NULL,
        WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,		
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        hwnd,
        NULL,
        ghThisInstance,
        NULL
        );

    SetWindowPos(hwndTT,
        HWND_TOPMOST,
        0,
        0,
        0,
        0,
        SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);

    /* GET COORDINATES OF THE MAIN CLIENT AREA */
    GetClientRect (hwnd, &rect);
	
    /* INITIALIZE MEMBERS OF THE TOOLINFO STRUCTURE */
    ti.cbSize = sizeof(TOOLINFO);
    ti.uFlags = TTF_SUBCLASS;
    ti.hwnd = hwnd;
    ti.hinst = ghThisInstance;
    ti.uId = uid;
    ti.lpszText = lptstr;
        // ToolTip control will cover the whole window
    ti.rect.left = rect.left;    
    ti.rect.top = rect.top;
    ti.rect.right = rect.right;
    ti.rect.bottom = rect.bottom;
    
    /* SEND AN ADDTOOL MESSAGE TO THE TOOLTIP CONTROL WINDOW */
    SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);	
}


Вообще, желательно почитывать MSDN - там много хорошей и нужной иформации по Вин32 :)


Дата: Ноя 14, 2003 18:48:20

Songoku
Неправильно! WS_TABSTOP equ WS_MAXIMIZEBOX


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.070