| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2138 人关注过本帖
标题:这个Win32程序为什么没弹出窗口啊?
只看楼主 加入收藏
dizengrong
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2008-8-25
结帖率:100%
收藏
 问题点数:0 回复次数:4 
这个Win32程序为什么没弹出窗口啊?
Win32汇编刚接触,感觉一开始好困难啊,下面的程序基本和书上的例子相同,怎么就没弹出窗口呢?纳闷啊
麻烦哪位给看看
程序代码:
.386
.model flat, stdcall
option casemap:none

_WinMain proto :DWORD, :DWORD, :DWORD, :DWORD  
include         windows.inc
include         user32.inc
includelib    user32.lib
include         kernel32.inc
includelib    kernel32.lib
include        gdi32.inc
includelib    gdi32.inc

.data
className    BYTE  "My class",0
TextString    BYTE  "I have paint teh text successfully!",0
classCaptin    BYTE  "This is captin.",0

.data?
hinstance    DWORD ?
hWinMain        DWORD ?

.code
start:
        invoke     GetModuleHandle,NULL
        mov          hinstance,eax
        invoke    _WinMain,hinstance,NULL,NULL,SW_NORMAL
        invoke     ExitProcess,0

_WinMain proc    hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
            local ms:MSG
            local    wc:WNDCLASSEX
            local hWnd:DWORD 
            
            ;填充wc
            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+1
            mov   wc.lpszMenuName,NULL
            mov   wc.lpszClassName,OFFSET className
            invoke LoadIcon,NULL,IDI_APPLICATION;加载窗口最左上方的图标,若第一个为NULL则加载Windows自定义的
            mov    wc.hIcon,eax
            mov    wc.hIconSm,eax
            invoke LoadCursor,NULL,IDC_APPSTARTING
            mov    wc.hCursor,eax
            ;注册新窗口
            invoke RegisterClassEx,addr wc
            ;创建窗口
            invoke CreateWindowEx,WS_EX_CLIENTEDGE,addr className,addr classCaptin,WS_ACTIVECAPTION,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL
            mov    hWnd,eax
            ;显示窗口
            invoke ShowWindow,hWnd,SW_SHOWNORMAL
            ;更新窗口
            invoke UpdateWindow,hWnd
            ;消息循环
            .while TRUE
                    invoke GetMessage,addr ms,hWnd,0,0
                    ;当检索到消息WM_QUIT时,GetMessage的返回值为0
                    .break .if(!eax)
                    invoke    TranslateMessage,addr ms
                    invoke    DispatchMessage,addr    ms
            .endw
            ret
_WinMain endp
;窗口过程
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

            local hdc:DWORD 
            local ps:PAINTSTRUCT
            local rectage:RECT
            mov     eax,uMsg
            .if        eax==WM_DESTROY
                        invoke PostQuitMessage,0
            .elseif    eax==WM_PAINT
                        invoke BeginPaint,NULL,addr ps
                        mov      hdc,eax
                        invoke GetClientRect,hWnd,addr rectage
                        invoke DrawText,hdc,addr TextString,-1,addr rectage,DT_SINGLELINE or DT_VCENTER or DT_CENTER
                        invoke EndPaint,hdc,addr ps
            .else
                        invoke DefWindowProc,hWnd,WM_ACTIVATE,wParam,lParam
                        ret
            .endif
            xor        eax,eax
            ret
WndProc endp

end start
                        
搜索更多相关主题的帖子: 窗口 
2008-10-13 22:38
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
没有弹出窗口?
那一定是在"参数"上出了问题了.
;============================
自己补充一下:说一定是"参数"出问题,过于武断了.俺就碰到过,由于在调用DefWindowProc函数后,没有RET 返回语句,编译虽然通过了,但也没有弹出窗口!

[[it] 本帖最后由 ONEPROBLEM 于 2008-11-14 10:11 编辑 [/it]]
2008-10-14 08:30
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
我帮你修改了一下,你自己看看哈.
.386
.model flat, stdcall
option casemap:none

_WinMain proto :DWORD, :DWORD, :DWORD, :DWORD  
include         windows.inc
include         user32.inc
includelib    user32.lib
include         kernel32.inc
includelib    kernel32.lib
include        gdi32.inc
includelib    gdi32.inc

.data
className    BYTE  "My class",0
TextString    BYTE  "I have paint teh text successfully!",0
classCaptin    BYTE  "This is captin.",0

.data?
hinstance    DWORD ?
hWinMain        DWORD ?

.code
start:
        invoke     GetModuleHandle,NULL
        mov          hinstance,eax
        invoke    _WinMain,hinstance,NULL,NULL,SW_NORMAL
        invoke     ExitProcess,0

_WinMain proc    hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
            local ms:MSG
            local    wc:WNDCLASSEX
            local hWnd:DWORD
            
            ;填充wc
            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+1
            mov   wc.lpszMenuName,NULL
            mov   wc.lpszClassName,OFFSET className
            invoke LoadIcon,NULL,IDI_APPLICATION;加载窗口最左上方的图标,若第一个为NULL则加载Windows自定义的
            mov    wc.hIcon,eax
            mov    wc.hIconSm,eax
            invoke LoadCursor,NULL,IDC_APPSTARTING
            mov    wc.hCursor,eax
            ;注册新窗口
            invoke RegisterClassEx,addr wc
            ;创建窗口
            invoke CreateWindowEx,WS_EX_CLIENTEDGE,addr className,addr classCaptin,WS_OVERLAPPEDWINDOW,100,100,500,500,NULL,NULL,hInst,NULL ;五改
            mov    hWnd,eax
            push    hWnd
            pop        hWinMain   ;一改

            ;显示窗口
            invoke ShowWindow,hWnd,SW_SHOWNORMAL
            ;更新窗口
            invoke UpdateWindow,hWnd
            ;消息循环
            .while TRUE
                    invoke GetMessage,addr ms,0,0,0  ;二改
                    ;当检索到消息WM_QUIT时,GetMessage的返回值为0
                    .break .if(!eax)
                    invoke    TranslateMessage,addr ms
                    invoke    DispatchMessage,addr    ms
            .endw
            ret
_WinMain endp
;窗口过程
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

            local hdc:DWORD
            local ps:PAINTSTRUCT
            local rectage:RECT
            mov     eax,uMsg
            .if        eax==WM_DESTROY
                        invoke PostQuitMessage,0
            .elseif    eax==WM_PAINT
                        invoke BeginPaint,hWnd,addr ps   ;三改                        mov      hdc,eax
                        invoke GetClientRect,hWnd,addr rectage
                        invoke DrawText,hdc,addr TextString,-1,addr rectage,DT_SINGLELINE or DT_VCENTER or DT_CENTER
                        invoke EndPaint,hdc,addr ps
            .else
                        invoke DefWindowProc,hWnd,uMsg,wParam,lParam   ;四改
                        ret
            .endif
            xor        eax,eax
            ret
WndProc endp

end start
收到的鲜花
  • 你们都要疼我哦2008-10-14 16:05 送鲜花  10朵   附言:版主又热心又有耐心哇.
2008-10-14 08:40
ONEPROBLEM
Rank: 6Rank: 6
来 自:广西 南宁
等 级:贵宾
威 望:21
帖 子:1569
专家分:349
注 册:2008-7-11
收藏
得分:0 
hWinMain这个是全局变量,要给它赋值,可能"消息"结构要用到它;
DefWindowProc这个函数的参数不对,那么程序就不会自动退出,有时候表面上窗口已经关闭了,但程序的消息循环还会在那里打转;
WS_OVERLAPPEDWINDOW得有,要指定窗口的风格特性.
2008-10-14 08:45
dizengrong
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2008-8-25
收藏
得分:0 
呜呜~~~~
感激涕零啊!!!终于解决了
2008-10-14 15:46
快速回复:这个Win32程序为什么没弹出窗口啊?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013488 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved