用SDK编写基于对话框的应用程序的问题!!

Ziox 2003-10-08 10:21:40
请教各位高手 用SDK编写基于对话框的程序 应该怎么写??
为什么我用VC写的 不能响应消息?? 根本都不能关闭 只能强制关闭~~

我在程序中做如下修改:
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = DLGWINDOWEXTRA;//添加了DLGWINDOWEXTRA这个值
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_ICECHAT);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCSTR)IDC_ICECHAT;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

return RegisterClassEx(&wcex);
}


BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;

hInst = hInstance; // Store instance handle in our global variable

hWnd = CreateDialog(hInst, (LPCTSTR)IDD_MAINDLG, 0, NULL);//我修改CreateWindow为CreateDialog,IDD_MAINDLG 是我建立的 对话框模板的id

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}

我实在搞不懂 为什么~~
请高手赐教了 分不够再加了~~~
谢了~~
...全文
185 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingtsui 2003-10-13
  • 打赏
  • 举报
回复
基于对话框的程序中 主窗体对话框,我认为是无所谓 Modal Box 和 Modaless Box 的吧

不好意思,我不用QQ的,有什么问题直接用短消息好了
Ziox 2003-10-11
  • 打赏
  • 举报
回复
为什么 书上的例子 可以用 WndProc 处理对话框的消息 而我的程序不行呢? 书上的例子中 CreateDialog (hInstance, szAppName, 0, NULL /*注意*/ ) 我有一些不明白~
Ziox 2003-10-11
  • 打赏
  • 举报
回复
哦~ 原来如此~~
这个地方 我弄了好几天 一直都不明白 为什么~~
现在懂了~~
谢谢 “老农民” 了~~ 特别感谢~
呵呵~~~~

还有一个问题~
用Modal Box 和 Modaless Box 都有什么优缺点? 我是说 做这样的 基于对话框的程序中 主窗体对话框~

可否把你的QQ 告诉我? 呵呵~~
向你学习学习~~ 呵呵~~ 谢谢了~ :)
kingtsui 2003-10-11
  • 打赏
  • 举报
回复
书上的例子里后面特别讲到了对话框模版文件里的CLASS "HexCalc",就是这个东西起了作用书上的这个例子的原理是先注册一个szAppName(就是“HexCalc”)的window class,然后再建立了一个HexCalc名称的对话框模版,再在这个模版里指定对话框为HexCalc windows class(就是CLASS "HexCalc"这一句),这样就从模版这里与类和WndProc挂上了钩,然后在WinMain里用这个模版CreateDialog.
这种方式太复杂,用了非公开的技术,我前面提供的方式属于正规的方法,很容易理解的
Ziox 2003-10-10
  • 打赏
  • 举报
回复
“老农民” 说话不要这么不客气~~
你倒是要考虑考虑 回家种田~~


Programming Windows 中 Chapter11-Dialog Box > Modeless Dialog Box 这一节 中 一个例题 就是这么写的~~
不知道 "老农民"看过吗~~

用他的方法为什么不行~~ 还请"老农民"指教~~~

下面是这个程序的 一部分~~::

#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HexCalc") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;

wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = DLGWINDOWEXTRA ; // Note!
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (hInstance, szAppName) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;

if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}

hwnd = CreateDialog (hInstance, szAppName, 0, NULL) ;

ShowWindow (hwnd, iCmdShow) ;

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}

.
.
.

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static BOOL bNewNumber = TRUE ;
static int iOperation = `=` ;
static UINT iNumber, iFirstNum ;
HWND hButton ;

switch (message)
{
case WM_KEYDOWN: // left arrow --> backspace
if (wParam != VK_LEFT)
break ;
wParam = VK_BACK ;
// fall through
case WM_CHAR:
if ((wParam = (WPARAM) CharUpper ((TCHAR *) wParam)) == VK_RETURN)
wParam = `=` ;

if (hButton = GetDlgItem (hwnd, wParam))
{
SendMessage (hButton, BM_SETSTATE, 1, 0) ;
Sleep (100) ;
SendMessage (hButton, BM_SETSTATE, 0, 0) ;
}
else
{
MessageBeep (0) ;
break ;
}
// fall through
case WM_COMMAND:
SetFocus (hwnd) ;

if (LOWORD (wParam) == VK_BACK) // backspace
ShowNumber (hwnd, iNumber /= 16) ;

else if (LOWORD (wParam) == VK_ESCAPE) // escape
ShowNumber (hwnd, iNumber = 0) ;

else if (isxdigit (LOWORD (wParam))) // hex digit
{
if (bNewNumber)
{
iFirstNum = iNumber ;
iNumber = 0 ;
}
bNewNumber = FALSE ;

if (iNumber <= MAXDWORD >> 4)
ShowNumber (hwnd, iNumber = 16 * iNumber + wParam -
(isdigit (wParam) ? `0': `A' - 10)) ;
else
MessageBeep (0) ;
}
else // operation
{
if (!bNewNumber)
ShowNumber (hwnd, iNumber =
CalcIt (iFirstNum, iOperation, iNumber)) ;
bNewNumber = TRUE ;
iOperation = LOWORD (wParam) ;
}
return 0 ;

case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

=======================================================================
//下面是 资源文件


HEXCALC.RC (excerpts)

//Microsoft Developer Studio generated resource script.
#include "resource.h"
#include "afxres.h"

/////////////////////////////////////////////////////////////////////////////
// Icon

HEXCALC ICON DISCARDABLE "HexCalc.ico"

/////////////////////////////////////////////////////////////////////////////

#include "hexcalc.dlg"

===========================================================================

//下面是 对话框模板文件

HEXCALC.DLG
/*---------------------------
HEXCALC.DLG dialog script
---------------------------*/

HexCalc DIALOG -1, -1, 102, 122
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
CLASS "HexCalc"
CAPTION "Hex Calculator"
{
PUSHBUTTON "D", 68, 8, 24, 14, 14
PUSHBUTTON "A", 65, 8, 40, 14, 14
PUSHBUTTON "7", 55, 8, 56, 14, 14
PUSHBUTTON "4", 52, 8, 72, 14, 14
PUSHBUTTON "1", 49, 8, 88, 14, 14
PUSHBUTTON "0", 48, 8, 104, 14, 14
PUSHBUTTON "0", 27, 26, 4, 50, 14
PUSHBUTTON "E", 69, 26, 24, 14, 14
PUSHBUTTON "B", 66, 26, 40, 14, 14
PUSHBUTTON "8", 56, 26, 56, 14, 14
PUSHBUTTON "5", 53, 26, 72, 14, 14
PUSHBUTTON "2", 50, 26, 88, 14, 14
PUSHBUTTON "Back", 8, 26, 104, 32, 14
PUSHBUTTON "C", 67, 44, 40, 14, 14
PUSHBUTTON "F", 70, 44, 24, 14, 14
PUSHBUTTON "9", 57, 44, 56, 14, 14
PUSHBUTTON "6", 54, 44, 72, 14, 14
PUSHBUTTON "3", 51, 44, 88, 14, 14
PUSHBUTTON "+", 43, 62, 24, 14, 14
PUSHBUTTON "-", 45, 62, 40, 14, 14
PUSHBUTTON "*", 42, 62, 56, 14, 14
PUSHBUTTON "/", 47, 62, 72, 14, 14
PUSHBUTTON "%", 37, 62, 88, 14, 14
PUSHBUTTON "Equals", 61, 62, 104, 32, 14
PUSHBUTTON "&&", 38, 80, 24, 14, 14
PUSHBUTTON "|", 124, 80, 40, 14, 14
PUSHBUTTON "^", 94, 80, 56, 14, 14
PUSHBUTTON "<", 60, 80, 72, 14, 14
PUSHBUTTON ">", 62, 80, 88, 14, 14
}



还请"老农民"解释一下~
kingtsui 2003-10-10
  • 打赏
  • 举报
回复
受不了你了,跟你说这么明白,你压根就没去试过,还在这里乱发一气
HWND CreateDialog(
HINSTANCE hInstance,
LPCTSTR lpTemplate,
HWND hWndParent,
DLGPROC lpDialogFunc
);
是个WIN32 API,他就要求必须有lpDialogFunc这个参数,否则无法处理消息,明白了没?

要是这都理解不了非得自己填个NULL,我看你回家种田算了
Ziox 2003-10-09
  • 打赏
  • 举报
回复
当然 RegisterClass了
我是用向导 中 Win32 Application 生成的 hello world 中直接修改的代码~
改了 我上面说的两处~~ 为什么不好使呢~~
书上例子中 就可以~~

还有 我这么做 有什么好处?? 和 alon21(飘一族.Alon)说的方法 之间的 区别是什么?
都有什么优缺点??
alon21 2003-10-09
  • 打赏
  • 举报
回复
//下面是一个完整的Dlg sdk程序 其中 IDD_DIALOG1 是你的对话框资源 ID
//Alon
/**********************************************/
/* 显示 Dialog Box */
/**********************************************/
#include <windows.h>
#include "resource.h"

// 函数类型说明
LRESULT CALLBACK MainDialogProc( HWND, UINT, WPARAM, LPARAM );

// Windows 主函数
int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)MainDialogProc);
return TRUE;
}

// Windows 事件处理
LRESULT CALLBACK MainDialogProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
//消息的处理,我想你要的就是这里了
switch(message)
{
case WM_COMMAND: //IDC_CLOSE 是我在对话框中加入的一个按钮的ID 也可以关闭
if (LOWORD(wParam)==IDC_CLOSE) PostQuitMessage(0);
return TRUE;
break;
case WM_CLOSE: //关闭在这里
EndDialog(hDlg, TRUE);
return TRUE;
break;
}
return FALSE;
}

kingtsui 2003-10-09
  • 打赏
  • 举报
回复
按我说的试一下,先处理最简单的WM_COMMAND里的IDOK, IDCANCEL
switch(message)
{
case WM_COMMAND:
if(LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hWnd, LOWORD(wParam));
return TRUE;
}
break;
}
Ziox 2003-10-09
  • 打赏
  • 举报
回复
各位有没有人 知道 我的问题 到底出在哪儿呀
kingtsui 2003-10-09
  • 打赏
  • 举报
回复
hWnd = CreateDialog(hInst, (LPCTSTR)IDD_MAINDLG, 0, NULL);
这里没有Dialog的消息处理函数
你需要写一个自己的Dialog消息处理函数,或者直接在WndProc处理Dialog消息也行,但是这一句要改一下
hWnd = CreateDialog(hInst, (LPCTSTR)IDD_MAINDLG, 0, (DLGPROC)WndProc);
并且,WinMain的主消息循环部分也要改一下
while(GetMessage(&msg, NULL, 0, 0))
{
if(!IsWindow(hWnd) || !IsDialogMessage(hWnd), &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
这里的hWnd就是CreateDialog时返回的Dilaog Handle
Ziox 2003-10-09
  • 打赏
  • 举报
回复
第一个 是一个 空项目 需要自己建立 所有的代码
第二个 是一个 只有Win32程序 框架的 项目 建立一下 你就知道了 我也是刚刚学习 我估计 是编写游戏等 因为 里面 也是什么也没有 只有一个 大框架 用来写一些 非“标准”的程序的吧 呵呵 所有的东西 都要自己添加
第三个 是一个 标准的桌面程序 可以在 这个基础上编写 桌面应用程序 许多东西 VC已经提供了 不需要在重复编写那些一样的代码
fanlongly 2003-10-09
  • 打赏
  • 举报
回复
楼上的朋友能不能告诉我创建时如何设置吗?我选择了Win32 Application以后出现3个选项,我该选什么?各有什么用处?
Ziox 2003-10-09
  • 打赏
  • 举报
回复
在VC中 应用程序向导中 有一个Win32 Application 这个建立SDK程序
或者 直接编写代码~~ 赫赫~~
我也是刚学
fanlongly 2003-10-09
  • 打赏
  • 举报
回复
楼上的各位朋友,问一个特“菜”的问题,SDK程序怎么建立?比如MFC可以在打开VC后,在工程中选择MFC AppWizard就可以建立了,SDK该怎么做?一时感兴趣,向各位大哥请教!
xjy521 2003-10-09
  • 打赏
  • 举报
回复
up
yintongshun 2003-10-09
  • 打赏
  • 举报
回复
其实alon21(飘一族.Alon)说的就很好了
yintongshun 2003-10-09
  • 打赏
  • 举报
回复
你要这么用也可以,但要先RegisterClass
Ziox 2003-10-09
  • 打赏
  • 举报
回复
有人知道 怎么回事吗??~~
Ziox 2003-10-09
  • 打赏
  • 举报
回复
可是我在书上看到的 就是这样写的 为什么我的不可以??
我看的是那本 Windows程序设计 全名是什么 我忘了 好像是这个 就是那本 很经典的~~
呵呵~~
国外的那本 嘿嘿~~~~
他用 CreateDialog()却可以 利用 WndProc进行消息处理~~
需不需要 我把 源程序 发上来?? 太大了~~

加载更多回复(5)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧