上一题下一题
跳转到
 
 
  世界如此多姿,发展如此迅速,窥一斑未必还能知全豹。但正如万花筒一样,每一个管窥都色彩斑斓。  
 
 
  知识通道 | 学习首页 | 教师首页 | PK首页 | 知识创造首页 | 企业首页 | 登录
 
本文对应知识领域
中级编程实例
作者:未知 申领版权
2010年12月12日 共有 1826 次访问 【添加到收藏夹】 【我要附加题目
受欢迎度:

    中级编程实例
    程序Hello.exe是十分简单的,基本上没有什么用户界面。下面介绍一个相对而言稍微复杂的例子。我们将写一个 Windows 程序,它会在桌面显示一个标准的窗口
    1.   理论
    Windows 程序中,在写图形用户界面时需要调用大量的标准 Windows Gui 函数。其实这对用户和程序员来说都有好处,对于用户,面对的是同一套标准的窗口,对这些窗口的操作都是一样的,所以使用不同的应用程序时无须重新学习操作。对程序员来说,这些 Gui 源代码都是经过了微软的严格测试,随时拿来就可以用的。当然至于具体地写程序对于程序员来说还是有难度的。为了创建基于窗口的应用程序,必须严格遵守规范。作到这一点并不难,只要用模块化或面向对象的编程方法即可。
    下面我就列出在桌面显示一个窗口的几个步骤:
    1. 得到您应用程序的句柄(必需); 
    2. 得到命令行参数(如果您想从命令行得到参数,可选); 
    3. 注册窗口类(必需,除非您使用 Windows 预定义的窗口类,如 MessageBox 或 dialog box; 
    4. 产生窗口(必需); 
    5. 在桌面显示窗口(必需,除非您不想立即显示它); 
    6. 刷新窗口客户区; 
    7. 进入无限的获取窗口消息的循环; 
    8. 如果有消息到达,由负责该窗口的窗口回调函数处理; 
    9. 如果用户关闭窗口,进行退出处理。 
    相对于单用户的 DOS 下的编程来说,Windows 下的程序框架结构是相当复杂的。但是 Windows 和 DOS 在系统架构上是截然不同的。Windows 是一个多任务的操作系统,故系统中同时有多个应用程序彼此协同运行。这就要求 Windows 程序员必须严格遵守编程规范,并养成良好的编程风格。
    在进入复杂的细节前,我将提纲挈领地指出几点要点:
    1. 您应当把程序中要用到的所有常量和结构体的声明放到一个头文件中,并且在源程序的开始处包含这个头文件。这么做将会节省您大量的时间,也免得一次又一次的敲键盘。
    2. 用 includelib 指令,包含您的程序要引用的库文件,譬如:若您的程序要调用 "MessageBox", 您就应当在源文件中加入如下一行: includelib user32.lib 这条语句告诉 MASM 您的程序将要用到一些引入库。如果您不止引用一个库,只要简单地加入 includelib 语句,不要担心链接器如何处理这么多的库,只要在链接时用链接开关 /LIBPATH 指明库所在的路径即可。 
    3. 在其它地方运用头文件中定义函数原型,常数和结构体时,要严格保持和头文件中的定义一致,包括大小写。在查询函数定义时,这将节约您大量的时间;
    4. 在编译,链接时用makefile文件,免去重复敲键。
    
    2.源程序
    ;****************************************
    ;文件:ASM32.ASM                                         *
    ;功能:显示一个标准窗口                                 *
    ;****************************************
    .386 
    .model flat,stdcall 
    option casemap:none 
    include \masm32\include\windows.inc 
    include \masm32\include\user32.inc 
    includelib \masm32\lib\user32.lib  
    include \masm32\include\kernel32.inc 
    includelib \masm32\lib\kernel32.lib 
    
    WinMain proto :DWORD,:DWORD,:DWORD,:DWORD 
    
    .DATA                                                   ; initialized data 
    ClassName db "SimpleWinClass",0        ; the name of our window class 
    AppName db "Our First Window",0       ; the name of our window 
    DATA?                                                  ; Uninitialized data 
    hInstance HINSTANCE ?                       ; Instance handle of our program 
    CommandLine LPSTR ? 
    .CODE                                                   ; Here begins our code 
    start: 
    invoke GetModuleHandle, NULL           ; get the instance handle of our program. 
    ; Under Win32, hmodule==hinstance
    mov hInstance,eax 
    invoke GetCommandLine                       ; get the command line. You don't have 
    ;to call this function IF your program
    ;doesn't process the command line. 
    mov CommandLine,eax 
    invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
    ; call the main function 
    invoke ExitProcess, eax                          ; quit our program. 
    WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD 
    LOCAL wc:WNDCLASSEX               ; create local variables on stack 
    LOCAL msg:MSG 
    LOCAL hwnd:HWND 
    mov   wc.cbSize,SIZEOF WNDCLASSEX        ; fill values in members of wc
    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                      ; register our window class 
    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            ; display our window on desktop
    invoke UpdateWindow, hwnd                           ; refresh the client area 
    .WHILE TRUE                                          ; Enter message loop 
    invoke GetMessage, ADDR msg,NULL,0,0 
    .BREAK .IF (!eax) 
    invoke TranslateMessage, ADDR msg 
    invoke DispatchMessage, ADDR msg 
    .ENDW 
    mov     eax,msg.wParam                                   ; return exit code in eax 
    ret 
    WinMain endp 
    WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
    .IF uMsg==WM_DESTROY                            ; if the user closes our window 
    invoke PostQuitMessage,NULL                   ; quit our application 
    .ELSE 
    invoke DefWindowProc,hWnd,uMsg,wParam,lParam
    ; Default message processing
    ret 
    .ENDIF 
    xor eax,eax 
    ret 
    WndProc endp 
    end start 

    

 

相关新闻

肢体语言塑造你自己
每一个程序员要遵守的一些优秀编程风格
杂谈语言(之六)——文字改革(下):一失足成千古恨的文字改革
杂谈语言(之五)——文字改革(上):半吊子的改革最糟糕!
杂谈语言(之四)——续谈广东话的口头语(2)
杂谈语言(之四)——续谈广东话的口头语(1)
杂谈语言(之三)——那些深受古汉语影响的语言(方言)
杂谈语言(之二)——语言学习的边际成本递减效应
《VB程序设计基础》选择题
设计模式之Iterator

您可能对这些感兴趣  

干货分享|10本最受国外孩子喜爱的英文词典——上
从孩子的表现看父母的缺点!请家长对号入座,看看你是哪一类?
20条制作PPT的视觉原则
培训简史:培训者必知的历史轨迹
广田丰管理培训生人才培养调查报告
第4讲 作为上司的职业经理
第3讲 作为同事的职业经理
第2讲 作为下属的职业经理
第1讲 培养经理人的管理素养
酒店前台新员工上岗培训计划

题目筛选器
日期:
类型:
状态:
得分: <=
分类:
作者:
职业:
关键字:
搜索

 
 
 
  焦点事件
 
  知识体系
 
  职业列表
 
 
  最热文章
 
 
  最多引用文章
 
 
  最新文章
 
 
 
 
网站介绍 | 广告服务 | 招聘信息 | 保护隐私权 | 免责条款 | 法律顾问 | 意见反馈
版权所有 不得转载
沪ICP备 10203777 号 联系电话:021-54428255
  帮助提示    
《我的太学》是一种全新的应用,您在操作中遇到疑问或者问题,请拨打电话13564659895,15921448526。
《我的太学》