Создание окна без объявления структур

Тема в разделе "WASM.WIN32", создана пользователем Llirik, 21 ноя 2008.

  1. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Здравствуйте. Меня интересует такой вопрос. Как можно создать хотя бы простое окно например без объявления структуры WNDCLASS?
    Зарание всем благодарен
     
  2. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Message-only window:

    Код (Text):
    1. HWND MesgWindow = CreateWindowEx(0, L"Message", NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
     
  3. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Вы меня наверно немного не поняли. Вот кусок кода:

    Winmain proc near

    mov style, CS_HREDRAW or CS_VREDRAW
    mov lpfnWndProc, OFFSET WndProc
    mov cbClsExtra,NULL
    mov cbWndExtra,NULL
    push diini
    pop hInstance
    mov hbrBackground,COLOR_WINDOW
    mov lpszMenuName,NULL
    mov lpszClassName,OFFSET titleprog
    push IDI_APPLICATION
    push 0
    call LoadIcon
    mov hIcon,eax
    mov hIconSm,eax
    push IDC_ARROW
    push 0
    call LoadCursor
    mov hCursor,eax
    lea eax,wc
    push eax
    call RegisterClassEx

    wc:
    cbSize DWORD ?
    style DWORD ?
    lpfnWndProc DWORD ?
    cbClsExtra DWORD ?
    cbWndExtra DWORD ?
    hInstance DWORD ?
    hIcon DWORD ?
    hCursor DWORD ?
    hbrBackground DWORD ?
    lpszMenuName DWORD ?
    lpszClassName DWORD ?
    hIconSm DWORD ?

    Где в нем ошибка??
     
  4. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Для создания окна WNDCLASS не нужна. Эта структура нужна для регистрации класса окна.
    По видимому, вы путаете эти понятия.
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    скорее всего в заполнении поля cbSize, отсутствующее в приведённом коде ;)
    кстати зачем lea eax, [wc]? можно же сразу push offset wc.
     
  6. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    Может, лучше так?
    Код (Text):
    1. DefStyle EQU CS_BYTEALIGNWINDOW or CS_HREDRAW or CS_VREDRAW
    2.  
    3. RegNewClass MACRO style:=<DefStyle>, wndproc:=<DefWindowProc>, cbClsExtra:=<0>, cbWndExtra:=<0>, hInstance:REQ, \
    4.   hIcon:=<NULL>, hCursor:=<NULL>, hbrBackground:=<NULL>, rcMenuName:=<NULL>, lpClassName:REQ, bNotPush
    5.  
    6.   IFB <bNotPush>
    7.     PUSH EDI
    8.   ENDIF
    9.   ;; Инициализация класса ...
    10.       MOV  EDI, ESP     ;; -- WNDCLASS struct stack begin
    11.       PUSH lpClassName
    12.       PUSH rcMenuName
    13.       PUSH hbrBackground
    14.       PUSH hCursor
    15.       PUSH hIcon
    16.       PUSH hInstance
    17.       PUSH cbWndExtra
    18.       PUSH cbClsExtra
    19.       PUSH wndproc
    20.       PUSH style
    21.       MOV  EAX, ESP     ;; -- WNDCLASS struct end
    22.   ;; Регистрация класса ...
    23.       PUSH EDI
    24.       INVOKE RegisterClass, EAX
    25.       POP  ESP          ;; restore stack
    26.   IFB <bNotPush>
    27.     POP  EDI
    28.   ENDIF
    29. ENDM
    А потом в коде уже использовать.
     
  7. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Strangest thing:
    this is NOT message-only window.
    Beware.
     
  8. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    About Window Classes
     
  9. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    а можно вообше вот так))
    Winmain proc near
    push ebp
    mov ebp, esp
    add esp,-50h
    mov DWORD PTR [ebp-30h],30h ;cbSize
    mov DWORD PTR [ebp-2ch],3 ;style, CS_HREDRAW or CS_VREDRAW
    mov DWORD PTR [ebp-28h],OFFSET WndProc ;lpfnWndProc, OFFSET WndProc
    mov DWORD PTR [ebp-24h],0 ;cbClsExtra,NULL
    mov DWORD PTR [ebp-20h],0 ;cbWndExtra,NULL
    push diini
    pop DWORD PTR [ebp-1ch] ;hInstance
    mov DWORD PTR [ebp-10h],5 ;hbrBackground,COLOR_WINDOW
    mov DWORD PTR [ebp-0ch],0 ;lpszMenuName,NULL
    mov DWORD PTR [ebp-8],OFFSET titleprog ;lpszClassName,OFFSET titleprog
    push IDI_APPLICATION
    push 0
    call LoadIcon
    mov DWORD PTR [ebp-18h],eax ;hIcon,eax
    mov DWORD PTR [ebp-4],eax ;hIconSm,eax
    push IDC_ARROW
    push 0
    call LoadCursor
    mov DWORD PTR [ebp-14h],eax ;hCursor,eax
    lea eax,DWORD PTR [ebp-30h]
    push eax
    call RegisterClassEx
    но мне всё-таки хотелось бы до конца, понять почему не заработал мой первый код)
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Llirik
    а ты cbSize исправил?
     
  11. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    да. поставил mov rcbSize,30h. но всё равно прога вылетает(
     
  12. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    Код (Text):
    1. mov cbSize,sizeof WNDCLASS
     
  13. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    Так у меня в коде нет структуры WNDCLASS как таковой
     
  14. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    ¦))
    Спасибо.

    Действительно, без HWND_MESSAGE никакое не message-only.
    Код (Text):
    1. CreateWindowEx(0, L"Message", NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL);
     
  15. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
  16. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    Llirik

    Так байт кода больше получается. Смотри мой пример )
     
  17. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    можно создать окно какогонить стандартного класса и пересетвиндовлонгить нужное.
     
  18. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Дизасм рулит.
     
  19. Llirik

    Llirik Member

    Публикаций:
    0
    Регистрация:
    18 июл 2008
    Сообщения:
    471
    А по моему нет) Размер ЕХЕ получается ровно такой же, как при использовании кода:

    include \masm32\include\windows.inc

    WinMain PROTO STDCALL :lol: WORD, :lol: WORD, :lol: WORD, :lol: WORD
    .data?
    hInstance dd ?

    .data
    ClassName db "FirstWindowClass",0
    AppName db "FirstWindow",0

    .code
    WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:lol: WORD
    LOCAL wc:WNDCLASSEX
    LOCAL hwnd:lol: WORD
    LOCAL msg:MSG
    mov wc.cbSize,SIZEOF WNDCLASSEX
    mov wc.style, CS_HREDRAW or CS_VREDRAW
    mov wc.lpfnWndProc, OFFSET WndProc
    mov wc.cbClsExtra,NULL
    mov wc.cbWndExtra,NULL
    push hInst
    pop wc.hInstance
    mov wc.hbrBackground,COLOR_WINDOW
    mov wc.lpszMenuName,NULL
    mov wc.lpszClassName,OFFSET ClassName
    invoke LoadIcon,NULL,IDI_APPLICATION
    mov wc.hIcon, eax
    mov wc.hIconSm, eax
    invoke LoadCursor,NULL,IDC_ARROW
    mov wc.hCursor,eax
    invoke RegisterClassEx, addr wc
     
  20. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    Llirik
    Код (Text):
    1. DefStyle EQU CS_BYTEALIGNWINDOW or CS_HREDRAW or CS_VREDRAW
    2.  
    3. RegNewClass MACRO style:=<DefStyle>, wndproc:=<DefWindowProc>, cbClsExtra:=<0>, cbWndExtra:=<0>, hInstance:REQ, \
    4.   hIcon:=<NULL>, hCursor:=<NULL>, hbrBackground:=<NULL>, rcMenuName:=<NULL>, lpClassName:REQ, bNotPush
    5.  
    6.   IFB <bNotPush>
    7.     PUSH EDI
    8.   ENDIF
    9.   ;; Инициализация класса ...
    10.       MOV  EDI, ESP     ;; -- WNDCLASS struct stack begin
    11.       PUSH lpClassName
    12.       PUSH rcMenuName
    13.       PUSH hbrBackground
    14.       PUSH hCursor
    15.       PUSH hIcon
    16.       PUSH hInstance
    17.       PUSH cbWndExtra
    18.       PUSH cbClsExtra
    19.       PUSH wndproc
    20.       PUSH style
    21.       MOV  EAX, ESP     ;; -- WNDCLASS struct end
    22.   ;; Регистрация класса ...
    23.       PUSH EDI
    24.       INVOKE RegisterClass, EAX
    25.       POP  ESP          ;; restore stack
    26.   IFB <bNotPush>
    27.     POP  EDI
    28.   ENDIF
    29. ENDM
    Я предлагаю вот это макроопределение использовать.