由零开始做 Dialog (SDK版) — 在 VC + MSDN 下取巧篇

发表于:2007-07-01来源:作者:点击数: 标签:
(一般来说要做一个 Dialog 是非常简单的,所以这篇教程是写给初学者的。但是由于篇幅所限,对窗体过程或事件驱动不做介绍。) 好了,言归正传。我们就马上来做吧。 打开你的 VC6 (如果有工程的请Close Workspace),选择新建工程(Win32 Application - An empty

    (一般来说要做一个 Dialog 是非常简单的,所以这篇教程是写给初学者的。但是由于篇幅所限,对窗体过程或事件驱动不做介绍。)
    好了,言归正传。我们就马上来做吧。
    打开你的 VC6 (如果有工程的请Close Workspace),选择新建工程(Win32 Application - An empty project ,记得选好保存路径),然后在该路径里新建一个 .cpp文件(比如WinMain.cpp),最后在工程管理窗口的 "FileView" 那里,选择 Add Files to project , 把刚新建的 WinMain.cpp 加入到工程里面去。
    好了,你现在已经有了一个工程文件了,如果你希望加入你自己定义的对话框,还要做一个资源文件,并包含到你的工程中来,就好像 WinMain.cpp 的那样。
在 VC6 的菜单 "Insert" – "Resource... Ctrl+R" 中,理所当然要加入一个 Dialog ,选择 "New" (不是Import)。 然后你就可以得到一个默认模板的对话框了,随便给这个新建的 Dialog 设置一些属性(双击该对话框的标题栏可以得到设置属性的对话框),比方说,那个对话框的 ID: 默认的是 IDD_DIALOG1 ,你就把它改为 "MYDIALOG" (请记住要给ID 加上双引号,默认的是没有引号的,这样做是为了可以不包含 Resource.h 的头文件);跟着你喜欢的话就改改标题吧,在 Caption: 里填入 my first Dialog 。 好了,剩下的就是保存工作了。请选择 Save All,选在你的工程的目录里保存该资源文件(我这里的名字选择 Resource.rc)。
好了,现在资源文件已经有了,剩下的就是把它加入到工程中来了,方法可以参考 WinMain.cpp 的加入,不再累叙 (在 FileView 里面加入)。

    好了,以下剩下的就是编辑你的 WinMaiin.cpp 了,也是我所说的可以取巧的地方。

    首先,你首先必须加入的是 这一句:  #include <windows.h>。 然后另起一行,键入 winmain之后再按 F1 键。  你是不是看到 MSDN 出来了呢? 那里面就有关于 WinMain 的定义和参数可以 copy 了,好了,拿来就用吧。把刚才键入的 winmain 删掉,拿从 MSDN 里 copy 来的代替。可以成为下面的样子(还要加入 return 0;语句)。

#include <windows.h>

int WINAPI WinMain(
  HINSTANCE hInstance,      // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,          // command line
  int nCmdShow              // show state
)
{ // 你可以插入你的代码于此
 return 0;
}

   好了,你试试编译一下,看看能不能够通过编译? OK 吧?取巧第一步成功了。现在函数入口总算出来了,可是你要建一个对话框的话,还需要一个对话框的 CALLBACK 过程。下面介绍小小的取巧办法。
这个过程实际上是一个函数,要在 WinMain  中使用的话就必须在 WinMain 之前定义了。那么请在 WinMain 的定义之前的位置某个空行输入 DialogProc 然后再次按下 F1 , call 出 MSDN 来。哈哈,关于 DialogProc 的定义及参数又可以抄了。代替你刚才键入的 DialogProc 吧,经过加工后就如下面的样子:
INT_PTR CALLBACK DialogProc(
  HWND hwndDlg,  // handle to dialog box
  UINT uMsg,     // message
  WPARAM wParam, // first message parameter
  LPARAM lParam  // second message parameter
  )
{ // 你可以插入你的代码于此
    return 0;
}

    这样还不行,还得对消息进行处理,加入如下句子:
    switch (uMsg)
    {
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK) EndDialog( hwndDlg, 0 );
        if (LOWORD(wParam) == IDCANCEL) EndDialog( hwndDlg, 0 );
}

    剩下的就只有一件事,就是在 WinMain 里面调用 DialogBox 函数了,(详细的参数请看 MSDN)
也就是在 WinMain 里面的第一句那里写入如下句子:

DialogBox( hInstance,"MYDIALOG", NULL, (DLGPROC)DialogProc );

    现在已经可以完全的编译和调用了。试试看,效果如何?是不是简单得来又显得比较专业?? 哈哈哈,其实不过满足了我自个的一点偷懒的心理而已(并非真的取巧!被骗了.....)。
    详细的代码见下面,<全文完>

// WinMain.cpp 源程序
#include <windows.h>

INT_PTR CALLBACK DialogProc(
  HWND hwndDlg,  // handle to dialog box
  UINT uMsg,     // message
  WPARAM wParam, // first message parameter
  LPARAM lParam  // second message parameter
  )
{
    switch (uMsg)
    {

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK) EndDialog( hwndDlg, 0 );
        if (LOWORD(wParam) == IDCANCEL) EndDialog( hwndDlg, 0 );

    }  // End of switch (uMsg)

    return 0;
}


int WINAPI WinMain(
  HINSTANCE hInstance,      // handle to current instance
  HINSTANCE hPrevInstance,  // handle to previous instance
  LPSTR lpCmdLine,          // command line
  int nCmdShow              // show state
)
{
    DialogBox( NULL, "MYDIALOG", NULL, (DLGPROC) DialogProc);
    return 0;
}

// End of source file


原文转自:http://www.ltesting.net