鱼C论坛

 找回密码
 立即注册
查看: 1388|回复: 2

程序无法显示图标,求助!

[复制链接]
发表于 2014-8-31 11:57:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 H云淡风清 于 2014-8-31 12:10 编辑

win32汇编写的一个程序,在程序里注册窗口类时设置了图标,在外面文件的图标可以显示,但是程序左上角无法显示图标,求大神看看啥问题。

.386
.model flat,stdcall
option casemap:none

include                windows.inc
include                user32.inc
includelib            user32.lib
include                kernel32.inc
includelib            kernel32.lib

IDR_MAIN            equ        1000h        ;菜单
ICO_MAIN            equ        2000h        ;图标
IDM_XINJIAN       equ        3000h        ;菜单项“新建”
IDM_DAKAI          equ        3001h        ;菜单项“打开”
IDM_GUANBI       equ        3002h        ;菜单项“关闭”
IDM_BAOCUN      equ        3003h        ;菜单项“保存”
IDM_TUICHU        equ        3004h        ;菜单项“退出”
IDM_GUANYU      equ        3005h        ;菜单项“关于”

.data?
        hInstance        dd        ?
        hWinMain       dd        ?
        hEmnu            dd        ?                ;菜单句柄
        hSubEmnu      dd        ?                ;右键菜单句柄
        szHC               db        32 dup(?)   ;缓冲区
        
.const
        szCaption            db        'Message',0
        szWndClass         db        'MyClass',0
        szText                  db        '暂不支持 “%s”呢',0
        szText1                db        '新建',0
        szText2                db        '打开',0
        szText3                db        '关闭',0
        szText4                db        '保存',0
        szText5                db        '这个可以有',0
        szHelpText          db        'BY: H.Z.J    E-mail: hInstance@126.com ',0
        
.code
        
        _procWinMain        proc uses ebx esi edi,hWnd,uMsg,wParam,lParam                ;窗口过程
                
                local @stPos : POINT
                
                mov eax,uMsg
                
                .if eax == WM_CLOSE
                        invoke DestroyWindow,hWinMain
                        invoke PostQuitMessage,NULL
                .elseif eax == WM_CREATE
                        invoke GetSubMenu,hEmnu,0
                        mov hSubEmnu,eax
                .elseif eax == WM_COMMAND        ;处理菜单
                                mov eax,wParam
                                movzx eax,ax
                                push eax
                                .if eax >= IDM_XINJIAN && eax <= IDM_BAOCUN        ;菜单项被选择时添加标记
                                                mov ebx,eax
                                                invoke GetMenuState,hEmnu,ebx,MF_BYCOMMAND
                                                .if eax == MF_CHECKED
                                                        mov eax,MF_UNCHECKED
                                                .else
                                                        mov eax,MF_CHECKED
                                                .endif
                                                invoke CheckMenuItem,hEmnu,ebx,eax
                                .endif
                                pop eax
                                ;处理各个菜单项
                                .if eax == IDM_XINJIAN                
                                        invoke wsprintf,addr szHC,addr szText,addr szText1
                                        invoke MessageBox,NULL,offset szHC,offset szCaption,MB_OK
                                .elseif eax == IDM_DAKAI
                                        invoke wsprintf,addr szHC,addr szText,addr szText2
                                        invoke MessageBox,NULL,offset szHC,offset szCaption,MB_OK
                                .elseif eax == IDM_GUANBI
                                        invoke wsprintf,addr szHC,addr szText,addr szText3
                                        invoke MessageBox,NULL,offset szHC,offset szCaption,MB_OK
                                .elseif eax == IDM_BAOCUN
                                        invoke wsprintf,addr szHC,addr szText,addr szText4
                                        invoke MessageBox,NULL,offset szHC,offset szCaption,MB_OK
                                .elseif eax == IDM_TUICHU
                                        invoke MessageBox,NULL,offset szText5,offset szCaption,MB_OK
                                        invoke DestroyWindow,hWinMain
                                        invoke PostQuitMessage,NULL
                                .elseif eax == IDM_GUANYU
                                        invoke MessageBox,NULL,offset szHelpText,offset szCaption,MB_OK
                                .endif
                                
                .elseif eax == WM_RBUTTONDOWN        ;右键弹出菜单
                        invoke GetCursorPos,addr @stPos
                        invoke TrackPopupMenu,hSubEmnu,TPM_LEFTALIGN,@stPos.x,@stPos.y,NULL,hWnd,NULL
                .else
                        invoke DefWindowProc,hWnd,uMsg,wParam,lParam
                        ret
                .endif
                
                xor eax,eax
                ret
                        
        _procWinMain        endp
        
        _WinMain        proc
                
                local @stClass        :        WNDCLASSEX
                local @stuMsg        :        MSG
                
                ;获取窗口句柄
                invoke GetModuleHandle,NULL
                mov hInstance,eax
                
                ;获取菜单句柄
                invoke LoadMenu,hInstance,IDR_MAIN
                mov hEmnu,eax
                
                invoke RtlZeroMemory,addr @stClass,sizeof @stClass
                
                ;注册窗口类
                invoke LoadCursor,0,IDC_ARROW
                mov @stClass.hCursor,eax
                invoke LoadIcon,0,ICO_MAIN
                mov @stClass.hIcon,eax
                mov @stClass.hIconSm,eax
                push hInstance
                pop @stClass.hInstance
                mov @stClass.cbSize,sizeof WNDCLASSEX
                mov @stClass.style,CS_VREDRAW or CS_HREDRAW
                mov @stClass.lpfnWndProc,offset _procWinMain
                mov @stClass.hbrBackground,COLOR_WINDOW + 1
                mov @stClass.lpszClassName,offset szWndClass
                invoke RegisterClassEx,addr @stClass
                
                ;建立窗口
                invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,offset szWndClass,offset szCaption,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,600,400,NULL,hEmnu,hInstance,NULL
                mov hWinMain,eax
                
                ;显示窗口
                invoke ShowWindow,hWinMain,SW_SHOWNORMAL
                invoke UpdateWindow,hWinMain
                
                ;消息循环
                .while TRUE
                
                        invoke GetMessage,addr @stuMsg,NULL,NULL,0
                        .break .if eax == 0
                        invoke TranslateMessage,addr @stuMsg
                        invoke DispatchMessage,addr @stuMsg
                
                .endw
                
                ret
                
        _WinMain        endp
        
start:

        call _WinMain
        invoke ExitProcess,NULL

end start

程序.rar

163.53 KB, 下载次数: 2

程序

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-31 12:21:25 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-31 17:27:44 | 显示全部楼层
第 119 行“invoke LoadIcon,0,ICO_MAIN”,应该改成“invoke LoadIcon,hInstance,ICO_MAIN”

评分

参与人数 2荣誉 +5 鱼币 +8 贡献 +5 收起 理由
H云淡风清 + 3 热爱鱼C^_^
小靚同学Leon + 5 + 5 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 13:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表