|
|
| Посл.отвђт | Сообщен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 · Поправил: 640kbinclude '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 |