Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Assembler | TASM] Создание меню, Создание меню без использования rc 
:(
    Опции темы
jahguru
Дата 25.10.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 24.5.2007

Репутация: нет
Всего: нет



Надо сделать программу в которой есть меню и подменю без использования файла ресурсов. С ресурсами я сделал.
Вот что получилось без ресурсов (создается только obj, при формировании exe выпадает куча ошибок почему то):

Код

p386      
jumps  
model flat, STDCALL   
include win32.inc      
L equ <LARGE>      
IDM_QUIT    equ    100
IDM_ABOUT    equ    101
MF_ENABLED    equ    0
MF_POPUP    equ     10h
MF_OWNERDRAW    equ    100h


extrn    BeginPaint        :PROC
extrn   CreateWindowExA    :PROC
extrn   DefWindowProcA    :PROC
extrn   DispatchMessageA    :PROC
extrn   EndPaint        :PROC
extrn   ExitProcess        :PROC
extrn   GetMessageA        :PROC
extrn   GetModuleHandleA    :PROC
extrn   LoadCursorA        :PROC
extrn   LoadIconA        :PROC          
extrn   RegisterClassA        :PROC
extrn    PostQuitMessage        :PROC
extrn   ShowWindow              :PROC
extrn   TranslateMessage       :PROC
extrn    UpdateWindow           :PROC
extrn    CreateMenu              :PROC
extrn    MessageBoxA             :PROC
extrn    AppendMenuA             :PROC
extrn    DrawMenuBar             :PROC
extrn   CreatePopupMenu       :PROC


     .data              
    newhwnd          dd    0
    lppaint          PAINTSTRUCT <?>
    msg              MSGSTRUCT   <?>
    wc               WNDCLASS    <?>
    hInst             dd    0
    fl         dw    0
    szTitleName          db 'Окно программы',0
    szClassName         db 'ASMCLASS32',0
    szHello         db    'Привет!',0
    szAppName     db    'Сообщение',0
    hMenu         dd    0
    hsubmenu         dd    0
    item1         db    'Меню',0
    item2         db    'Выход',0
    item3         db    'Возврат',0

    .code      
    
    start:
    push    L 0
    call    GetModuleHandleA
    mov     [hInst], eax


 mov     [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS
    mov     [wc.clsLpfnWndProc], offset WndProc
    mov     [wc.clsCbClsExtra], 0
    mov     [wc.clsCbWndExtra], 0
    mov     eax, [hInst]
    mov     [wc.clsHInstance], eax
    push    L IDI_APPLICATION
    push    L 0
    call    LoadIconA
    mov     [wc.clsHIcon], eax
    push    L IDC_ARROW
    push    L 0
    call    LoadCursorA
    mov     [wc.clsHCursor], eax
    mov     [wc.clsHbrBackground], COLOR_WINDOW + 1
    mov     dword ptr [wc.clsLpszMenuName],0 
    mov     dword ptr [wc.clsLpszClassName], offset szClassName
    push    offset wc
    call    RegisterClassA

    call   CreateMenu
    mov    [hMenu],eax
    push    L 0                      ; lpParam
    push    [hInst]                  ; hInstance
    push    [hMenu]                  ; menu
    push    L 0                      ; parent hwnd
    push    L CW_USEDEFAULT          ; height
    push    L CW_USEDEFAULT          ; width
    push    L CW_USEDEFAULT          ; y
    push    L CW_USEDEFAULT          ; x
    push    L WS_OVERLAPPEDWINDOW    ; Style
    push    offset szTitleName       ; Title string
    push    offset szClassName       ; Class name
    push    L 0                      ; extra style

    call    CreateWindowExA
    mov     [newhwnd], eax

    call    CreatePopupMenu
    mov    [hsubmenu], eax
    push    offset    item2
    push    L IDM_QUIT
    push    0
    push    eax
    call    AppendMenuA

    push    offset item3
    push    L IDM_ABOUT
    push    0
    push    [hsubmenu]  ;eax
     call    AppendMenuA

     push    offset   item1
push    [hsubmenu]
push    MF_POPUP
push       [hMenu]
call    AppendMenuA
nop


push    L SW_SHOWNORMAL
push    [newhwnd]
call    ShowWindow

push    [newhwnd]
call    UpdateWindow

push    [newhwnd]
call    DrawMenuBar
msg_loop:
push    L 0
push    L 0
push    L 0
push    offset msg
call    GetMessageA
cmp     ax, 0
je      end_loop

push    offset msg
call    TranslateMessage

push    offset msg
call    DispatchMessageA

jmp     msg_loop

end_loop:
push    [msg.msWPARAM]
call    ExitProcess




WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD,\
wparam:DWORD, lparam:DWORD
LOCAL   hDC:DWORD

cmp     [wmsg], WM_DESTROY
je      wmdestroy
cmp     [wmsg], WM_SIZE
je      wmsize
cmp     [wmsg], WM_CREATE
je      wmcreate
cmp     [wmsg],WM_PAINT
je      wmpaint

;**************************************
cmp    [wmsg],WM_COMMAND
je    wmcommand
;**************************************
jmp     defwndproc

wmcommand:
mov    eax,lparam
cmp    ax,0
jne    m1
mov    eax,wparam
cmp    ax,IDM_ABOUT
jne    m2
call    MessageBoxA,0,offset szHello,offset szAppName,MB_OK
jmp    m1
m2:    cmp    ax,IDM_QUIT
jne    m1
push    0
call    PostQuitMessage
m1:    mov    eax,0
jmp    finish


wmcreate:
mov     eax, 0
jmp     finish

defwndproc:
push    [lparam]
push    [wparam]
push    [wmsg]
push    [hwnd]
call    DefWindowProcA
jmp     finish

wmdestroy:
push    L    0
call    PostQuitMessage
mov     eax, 0
jmp     finish

wmsize:
mov     eax, 0
jmp     finish

wmpaint:
push    offset  lppaint
push    [hwnd]
call    BeginPaint
mov     [hDC],eax
push    offset lppaint
push    [hwnd]
call    EndPaint
mov     eax,0
jmp     finish

finish:
ret
WndProc          endp
;---------------------------------
public WndProc
end start                             



PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0395 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.