主题:win32汇编中怎样在大窗口建小窗口
比如把一个大窗口的左边分割成一个小窗口作为目录区,而右边用作内容显示.
;有空的朋友帮我查查错在哪里?本意是创建一个大窗口包涵着一个小窗口
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
mdi proto
.DATA
ClassName db "窗口类",0
MDIClassName db "子窗口类",0
MDIClientName db "MDICLIENT",0
AppName db "窗口名",0
MDIAppName db "子窗口名",0
.DATA?
hInstance HINSTANCE ?
hwnd HWND ?
hwndClient HWND ?
hwndFrame HWND ?
mdicreate MDICREATESTRUCT <>
CommandLine LPSTR ?
hMainMenu dd ?
hChildMenu dd ?
.CODE
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
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 hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
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
invoke CreateWindowEx,NULL,\
ADDR ClassName,\
ADDR AppName,\
WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
NULL,\
NULL,\
hInst,\
NULL
mov hwnd,eax
invoke ShowWindow, hwnd,CmdShow
invoke UpdateWindow, hwnd
.while TRUE
invoke GetMessage,ADDR msg,NULL,0,0
.break .if (!eax)
invoke TranslateMDISysAccel,hwndClient,addr msg
.if !eax
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.endif
.endw
mov eax,msg.wParam
ret
WinMain endp
WndProc proc uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_CREATE
invoke mdi
.ELSE
invoke DefFrameProc, hwnd, hwndClient, uMsg,wParam, lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
mdi proc
LOCAL mwc:WNDCLASSEX
LOCAL ClientStruct:CLIENTCREATESTRUCT
mov mwc.cbSize,SIZEOF WNDCLASSEX
mov mwc.style, CS_HREDRAW or CS_VREDRAW
mov mwc.lpfnWndProc,offset ChildProc
mov mwc.cbClsExtra,NULL
mov mwc.cbWndExtra,NULL
push hInstance
pop mwc.hInstance
mov mwc.hbrBackground,COLOR_APPWORKSPACE
mov mwc.lpszMenuName,NULL
mov mwc.lpszClassName,offset MDIClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov mwc.hIcon,eax
mov mwc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov mwc.hCursor,eax
invoke RegisterClassEx, addr mwc
invoke GetMenu,hwnd
mov hMainMenu,eax
invoke GetSubMenu,hMainMenu,1
mov ClientStruct.hWindowMenu,eax
mov ClientStruct.idFirstChild,100
INVOKE CreateWindowEx,NULL,ADDR MDIClientName,NULL,\
WS_CHILD or WS_VISIBLE or WS_CLIPCHILDREN,CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hwnd,NULL,\
hInstance,addr ClientStruct
mov hwndClient,eax
invoke CreateMDIWindow,ADDR MDIClassName,ADDR MDIAppName,\
WS_CHILD or WS_VISIBLE or WS_CLIPCHILDREN,10,\
10,200,300,hwndClient,\
hInstance,NULL
mov hwndFrame,eax
invoke ShowWindow,hwndFrame,SW_SHOWNORMAL
invoke UpdateWindow,hwndFrame
xor eax,eax
ret
mdi endp
ChildProc Proc uMsg:UINT, wParam:WPARAM, lParam:LPARAM
invoke DefFrameProc, hwnd, hwndClient, uMsg,wParam, lParam
xor eax,eax
ret
ChildProc endp
end start
;有空的朋友帮我查查错在哪里?本意是创建一个大窗口包涵着一个小窗口
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
mdi proto
.DATA
ClassName db "窗口类",0
MDIClassName db "子窗口类",0
MDIClientName db "MDICLIENT",0
AppName db "窗口名",0
MDIAppName db "子窗口名",0
.DATA?
hInstance HINSTANCE ?
hwnd HWND ?
hwndClient HWND ?
hwndFrame HWND ?
mdicreate MDICREATESTRUCT <>
CommandLine LPSTR ?
hMainMenu dd ?
hChildMenu dd ?
.CODE
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
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 hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
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
invoke CreateWindowEx,NULL,\
ADDR ClassName,\
ADDR AppName,\
WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
NULL,\
NULL,\
hInst,\
NULL
mov hwnd,eax
invoke ShowWindow, hwnd,CmdShow
invoke UpdateWindow, hwnd
.while TRUE
invoke GetMessage,ADDR msg,NULL,0,0
.break .if (!eax)
invoke TranslateMDISysAccel,hwndClient,addr msg
.if !eax
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.endif
.endw
mov eax,msg.wParam
ret
WinMain endp
WndProc proc uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_CREATE
invoke mdi
.ELSE
invoke DefFrameProc, hwnd, hwndClient, uMsg,wParam, lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
mdi proc
LOCAL mwc:WNDCLASSEX
LOCAL ClientStruct:CLIENTCREATESTRUCT
mov mwc.cbSize,SIZEOF WNDCLASSEX
mov mwc.style, CS_HREDRAW or CS_VREDRAW
mov mwc.lpfnWndProc,offset ChildProc
mov mwc.cbClsExtra,NULL
mov mwc.cbWndExtra,NULL
push hInstance
pop mwc.hInstance
mov mwc.hbrBackground,COLOR_APPWORKSPACE
mov mwc.lpszMenuName,NULL
mov mwc.lpszClassName,offset MDIClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov mwc.hIcon,eax
mov mwc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov mwc.hCursor,eax
invoke RegisterClassEx, addr mwc
invoke GetMenu,hwnd
mov hMainMenu,eax
invoke GetSubMenu,hMainMenu,1
mov ClientStruct.hWindowMenu,eax
mov ClientStruct.idFirstChild,100
INVOKE CreateWindowEx,NULL,ADDR MDIClientName,NULL,\
WS_CHILD or WS_VISIBLE or WS_CLIPCHILDREN,CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hwnd,NULL,\
hInstance,addr ClientStruct
mov hwndClient,eax
invoke CreateMDIWindow,ADDR MDIClassName,ADDR MDIAppName,\
WS_CHILD or WS_VISIBLE or WS_CLIPCHILDREN,10,\
10,200,300,hwndClient,\
hInstance,NULL
mov hwndFrame,eax
invoke ShowWindow,hwndFrame,SW_SHOWNORMAL
invoke UpdateWindow,hwndFrame
xor eax,eax
ret
mdi endp
ChildProc Proc uMsg:UINT, wParam:WPARAM, lParam:LPARAM
invoke DefFrameProc, hwnd, hwndClient, uMsg,wParam, lParam
xor eax,eax
ret
ChildProc endp
end start