• Windows编程学习笔记(十三)


    第九章 对话框

    模态对话框 

         对话框有两类,一中是【模态】一中是【非模态】,模态对话框是指当我们结束这个对话框时,才能对同一个程序中的另一个对话框进行交互,不过这时我们可以切换到其他程序。而非模态对话框则不具有这种性质。

        当我们建立一个对话框后,会生成一个建立的模板,比如:

    ABOUTBOX DIALOG DISCARDABLE 32, 32, 180, 100

    STYLE DS_MODALFRAME
    | WS_POPUP

    FONT
    8, "MS Sans Serif"

    BEGIN

    DEFPUSHBUTTON
    "OK",IDOK,66,80,50,14

    ICON
    "ABOUT1",IDC_STATIC,7,7,21,20

    CTEXT
    "About1",IDC_STATIC,40,12,100,8

    CTEXT
    "About Box Demo Program",IDC_STATIC,7,40,166,8

    CTEXT
    "(c) Charles Petzold, 1998",IDC_STATIC,7,52,166,8

    END

    ·其中DIALOG DISCARDABLE 是关键字,后四个数字是对话框的位置和大小,位置是相对于父窗口显示的。

    ·然后是STYLE

    ·FONT 字体

          当然这些东西我们也可以在对话框属性里面调整。

    如果我们想在对话框中用我们自定义的控件,比如一个椭圆形的OK按钮,我们可以使用一个子窗口来实现:

    ·先在main函数里注册一个类,”ok_button”

    ·然后我们就可以在上述的模板中,添加一个控件:”ok_button”,可以写成如下形式:

    CONTROL   "OK",IDOK,"ok_button",WS_GROUP | WS_TABSTOP,73,79,32,14

    ·这样,我们就可以在dialog中创建一个自定义的按钮了

     

    对话框的处理程序

    BOOL CALLBACK DialogProc(HWND , UINT , WPARAM , LPARAM );

    对话框的处理程序和窗口消息处理程序的区别:

    ·窗口消息处理程序WndProc返回LRESULT,而DialogProc返回BOOL

    ·如过WndProc不处理这个消息,那么将会呼叫DefWindowProc,而DialogProc如果不处理传回FALSE

    ·对话框程序不需要处理WM_PAINT 或 WM_DESTROY消息,对话框程序不接受WM_REATE消息,而是哎WM_INITDIALOG消息处理期间对对话框进行初始化工作。

    激活对话框

        如果我们显示叫一个定义好的对话框,我们可以这样做:

    DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG),hwnd,DialogProc);

        即使程序在显示对话框时,WndProc也可以接收消息。我们可以从对话框程序内部给WndProc发送消息:

    SendMessage(GetParent(hDlg), …);

        当我们需要控制对话框的控件时,我们可以使用函数来通过对话框句柄和控件ID来获得控件的句柄:

    GetDlgItem(hDlg,ID);       

    非模态对话框

       非模态对话框可以让我们在同一个程序中在不同的对话框中切换。模态对话框是用DialogBox来创建的,而非模态对话框则是用CreateDialog来建立的。

       非模态对话框与模态对话框有几点区别:

    ·非模态对话框通常包含一个标题列和系统菜单按钮。

    ·非模态对话框消息要通过程序式的消息队列,要将这些消息传送给对话框消息窗口处理程序,则必须改变消息队列。

    ·非模态对话框使用DestroyWindow而不是EndDialog来结束非模态对话框。(如果使用了Close按钮来结束对话框,我们必须处理WM_CLOSE消息,windows内的对话框窗口消息处理程序并不处理WM_CLOSE消息。

    while(GetMessage(&msg,NULL,0,0))
    {
    if(hDlgModeless == 0 || !IsDialogMessage(hDlgModeless,&msg))
      {
       TranslateMessage(
    &msg);
       DispatchMessage(
    &msg);
      }
    }

        如果消息是发给对话框的,那么IsDialogMessage将它发送给对话框消息处理程序,并传回TRUE。只有hDlgMedeless为0或者消息不是该对话框消息时,才必须呼叫TranslateMessage函数。

     

  • 相关阅读:
    在Windows中,U盘或者移动硬盘关不掉时,怎么知道是被哪个程序占用了呢?
    选择的文件中包含不支持的格式
    FTO Obesity Variant Circuitry and Adipocyte Browning in Humans
    SNPsnap | 筛选最佳匹配的SNP | 富集分析 | CP loci
    PhastCons | 序列保守性打分
    hg19基因组 | 功能区域 | 位置提取
    投稿SCI杂志 | 如何撰写cover letter | 如何绘制illustrated abstract
    variant的过滤 | filtering and prioritizing genetic variants
    会议录音的处理 | 提高音量 + 降噪 + 自动添加字幕
    小型数据工作站 | 管理和维护 | Jupyter | Rstudio server | Mac & Win10
  • 原文地址:https://www.cnblogs.com/lvpengms/p/1664721.html
Copyright © 2020-2023  润新知