天天看点

Win32汇编创建没有标题栏的窗体

  Win32汇编通过调用Windows 的API来创建窗体,在创建窗体时使用一个CreateWindowEx函数,通过传给这个函数的参数来确定窗口的样式。CreateWindowEx函数的用法是:

invoke  CreateWindowEx,dwExStyle,lpClassName, lpWindowName,dwStyle,\
        x,y,nWidth,nHeight,hWndParent,hMenu,hInstance,lpParam
           

  窗口的两个参数dwStyle和dwExStyle决定了窗口的外形和行为,dwStyle是从Win16开始就有的属性,这些属性的预定义值通常是以WS_开头dwStyle的具体样式参见Window Styles。dwExStyle是Win32中的扩展,它们是一些以WS_EX_开头的预定义值,定义了一些特殊的风格。dwExStyle的具体样式参见Extended Window Styles

  要创建没有标题栏的窗体只需要将窗体风格参数dwStyle设置成WS_POPUP就可以了,但由于没有了标题栏,此时的窗体是不会显示在Windows的任务栏上的。如果要将窗体显示在任务栏上,可以向窗体的扩展属性dwExStyle中添加扩展属性WS_EX_APPWINDOW,将窗体强制显示在任务栏上。

  由于窗体没有了标题栏,此时就无法通过点击标题栏来拖动窗口了。为了实现窗口移动,可以在处理窗口WM_LBUTTONDOWN消息中向系统发送WM_SYSCOMMAND消息并指定SC_DRAGMOVE标志,在一些低版本的编译器中没有定义该标志,引用该标志前应预先声明,该标志的值为0f012h。

_ProcWnd  proc     uses ebx edi esi,hWnd,uMsg,wParam,lParam
          mov      eax,uMsg
;*******************************************************************************************
          .if  eax ==  WM_LBUTTONDOWN
               mov     ebx,hTitle
               .if     ebx == hWnd
                       invoke  SendMessage,hWnd,WM_SYSCOMMAND,SC_DRAGMOVE,0
               .endif
;*******************************************************************************************
         .else    
               invoke DefWindowProc,hWnd,uMsg,wParam,lParam
               ret
          .endif
;*******************************************************************************************
              xor      eax,eax
          ret
_ProcWnd endp
           

  将无标题栏的窗口强制显示在任务栏后,当窗口最小化时,无法通过点击任务栏的窗口图标来还原窗口。这时就需要在处理WM_SYSCOMMAND消息时,处理SC_RESTORE标志。

_ProcWnd  proc     uses ebx edi esi,hWnd,uMsg,wParam,lParam
          mov      eax,uMsg
;*******************************************************************************************
          .if  eax ==  WM_SYSCOMMAND
                       mov      ebx,wParam
               .if     ebx == SC_RESTORE
                       invoke   ShowWindow,hWnd,SW_RESTORE
               .else
                       invoke   DefWindowProc,hWnd,uMsg,wParam,lParam
               .endif
;*******************************************************************************************
         .else    
               invoke DefWindowProc,hWnd,uMsg,wParam,lParam
               ret
          .endif
;*******************************************************************************************
              xor      eax,eax
          ret
_ProcWnd endp
           

继续阅读