• windows 窗体建立过程


    一.       先要定义自己将要使用WNDCALSS 的基本样式。
     
    typedef struct tagWNDCLASS {
      UINT      style;
      WNDPROC   lpfnWndProc;
      int       cbClsExtra;
      int       cbWndExtra;
      HINSTANCE hInstance;
      HICON     hIcon;
      HCURSOR   hCursor;
      HBRUSH    hbrBackground;
      LPCTSTR   lpszMenuName;
      LPCTSTR   lpszClassName;
    } WNDCLASS, *PWNDCLASS;

    参数按顺序解释

    1. UINT style : 字面意思可以设置我们将要建立窗体的的类型,

    http://msdn.microsoft.com/en-us/library/windows/desktop/ff729176(v=vs.85).aspx详细解释了每一个参数的意义。通过与运算可以设置多个。

    补充1.双击事件如果需要定义是在这里定义

    wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ; 

    只有定义这个才能在后面的消息拦截中拦截到doubleClick事件。

    2.WNDPROC lpfnWndProc 处理窗体的消息的函数

    3.int cbClsExtra 为在内存中放置的窗体设置一些额外空间

    4.int cbWndExtra 同上

    5.HINSTANCE hInstance 程序执行的实体代号,但是这里理解有点问题,这个玩意到底是进程线程的,理论上每一个窗体应该维护在线程中,但是这里只有一个主线程,而且没有明确的句柄,这里放置的是进程句柄这是个问题。      

     A handle to the instance of the module to be associated with the window.只有这么一句解释。

    1. HICON hIncon; 窗体的图标。

    LoadIcon (NULL, IDI_APPLICATION) ; 顺便记忆下这个函数,当使用系统提供的图标的时候第一个参数设置为NULL,如果要使用自己设置的资源图标,要将第一个参数设置为图标所在的进程中。第一个参数为资源所在进程的句柄,第二个为名称,如果使用默认则第一个为NULL

    6.HCURSOR hCursor;同上,原理类似。资源代表的应该是鼠标的图形。可以再这里更换。

    7.HBRSH hbrBackground ;可以看出来背景的颜色。

    8.LPCTSTR lpszMenuName;  菜单列的设置地方

    9.LPCTSTR lpszClassName  窗体名字设置、

    二.         注册

    书上的校验好像只是为了和WIN98兼容,一般register好像不太容易失败。

    三 ,  建立窗体

     

    视窗类别定义了视窗的一般特徵,因此可以使用同一视窗类别建立许多不

    同的视窗。实际呼叫CreateWindow 建立视窗时,可能指定有关视窗的更详细的

    资讯。

    Windows程式设计新手有时会混淆视窗类别和视窗之间的区别,以及为什么

    一个视窗的所有特徵不能被一次设定好。实际上,以这种方式分开这些样式资

    讯是非常方便的。例如,所有的按钮视窗都可以依据同样的视窗类别来建立,

    与这个视窗类别相关的视窗讯息处理程式位於Windows 内部。由视窗类别来负

    责处理按钮的键盘和滑鼠输入,并定义按钮在萤幕上的外观形象。从这一点看

    来,所有的按钮都是以同样的方式工作的。但是并非所有的按钮都是一样的。

    它们可以有不同的大小,不同的萤幕位置,以及不同的字串。後面的这样一些

    特徵是视窗定义的一部分,而不是视窗类别定义的。

    HWND WINAPI CreateWindow(
      __in_opt  LPCTSTR lpClassName,
      __in_opt  LPCTSTR lpWindowName,
      __in      DWORD dwStyle,
      __in      int x,
      __in      int y,
      __in      int nWidth,
      __in      int nHeight,
      __in_opt  HWND hWndParent,
      __in_opt  HMENU hMenu,
      __in_opt  HINSTANCE hInstance,
      __in_opt  LPVOID lpParam
    );

    参数一个一个解释。

    LPCTSTR lpClassName 和wndclass中最后一个参数对应。如果是建立特殊的控件,这里可体现的是控件上的字符。

    LPCTSTR lpWindowName 普通窗体的话就是标题列。

    DWORD dwStyle    标题列就是右边放大缩小这些的一些控制。

    Int x      初始化坐标,窗体的大小

    Int Y         初始化坐标,窗体的大小

    Int nWidth初始化坐标,窗体的大小

    Int nHeight初始化坐标,窗体的大小

    HWND hWndParent 父窗体的句柄,一般如果有子窗体的时候,子窗体默认总是在父窗体的上面。

    HMENU 菜单栏  设置菜单的一些特殊属性。

    HISNTANCE hInstance 貌似还是跟上面那个注册时候相同,实例是相同的。但是还是不知道到底是哪一个,进程还是线程的。

    LPVOID lpParem 特殊的参数

    显示窗体

    ShowWindow (hwnd, iCmdShow) ;

    第一个参数是刚刚用CreateWindow 建立的视窗代号。第二个参数是作为参

    数传给WinMain 的iCmdShow。它确定最初如何在萤幕上显示视窗,是一般大小、

    最小化还是最大化。

    五.更新窗体

    UpdateWindow (hwnd) ;

    会重画显示区域。它经由发送给视窗讯息处理程式(即HELLOWIN.C 中的WndProc 函式)一个WM_PAINT 讯息做到这一点。

     

    六.信息回圈

     

    程式通过执行一块称之为「讯息回圈」的程式码从讯息伫列中取出讯息:

    while (GetMessage (&msg, NULL, 0, 0))

    {

    TranslateMessage (&msg) ;

    DispatchMessage (&msg) ;

    }

    Msg 结构


  • 相关阅读:
    RegExp.$1
    Wide&Deep 模型学习教程
    docker 安装与使用的相关问题
    Centos 防火墙
    odoo ERP 系统安装与使用
    Linux 开机自动启动脚本
    intel RDT技术管理cache和memory_bandwidth
    tensorflow 中 inter_op 和 intra_op
    centos 7 安装 nginx 或 apache,及其比较
    Dependency injection in .NET Core的最佳实践
  • 原文地址:https://www.cnblogs.com/hatreds/p/2317853.html
Copyright © 2020-2023  润新知