SDK非模态对话框问题求助!

stackoverlow 2011-10-23 05:49:51
想用非模态对话框实现个计算器,加上加速键键盘接口,结果弄好之后不但加速键没用,连用鼠标也失效了。。
求助求大神解决看看我代码哪里有问题啊?先谢谢了,下面是界面的主要代码

#include <windows.h>
#include "core.h"
#include "resource.h"

LRESULT CALLBACK DialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
char source [MAX_SIZE];
char dest [40];
double cal_result;
HINSTANCE hInst;

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
static TCHAR szAppName[] = TEXT ("HexCalc") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
HACCEL hAccel ;

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

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

hwnd = CreateDialog (hInstance, MAKEINTRESOURCE(IDD_DIALOG), 0, NULL) ;

ShowWindow (hwnd, nShowCmd) ;
hAccel = LoadAccelerators (hInstance, MAKEINTRESOURCE(ID_ACC)) ;

while (GetMessage (&msg, NULL, 0, 0))
{
if (!TranslateAccelerator (hwnd, hAccel, &msg))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
}
return msg.wParam ;
}

LRESULT CALLBACK DialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
HWND hInput = GetDlgItem (hDlg, IDC_INPUT);
HWND hOut = GetDlgItem (hDlg, IDC_OUT);

switch (message)
{
case WM_COMMAND:
SetFocus (hDlg) ;
switch (LOWORD (wParam))
{
case IDM_HELP_ABOUT:
if (DialogBox (hInst, TEXT ("AboutBox"), hDlg, AboutDlgProc))
InvalidateRect (hDlg, NULL, TRUE) ;
return 0 ;

case IDC_0:
strcat (source, "0");
SetWindowTextA (hInput, source);
break;

case IDC_1:printf("1\n");
strcat (source, "1");
SetWindowTextA (hInput, source);
break;

case IDC_2:
strcat (source, "2");
SetWindowTextA (hInput, source);
break;

case IDC_3:
strcat (source, "3");
SetWindowTextA (hInput, source);
break;

case IDC_4:
strcat (source, "4");
SetWindowTextA (hInput, source);
break;

case IDC_5:
strcat (source, "5");
SetWindowTextA (hInput, source);
break;

case IDC_6:
strcat (source, "6");
SetWindowTextA (hInput, source);
break;

case IDC_7:
strcat (source, "7");
SetWindowTextA (hInput, source);
break;

case IDC_8:
strcat (source, "8");
SetWindowTextA (hInput, source);
break;

case IDC_9:
strcat (source, "9");
SetWindowTextA (hInput, source);
break;

case IDC_ADD:
strcat (source, "+");
SetWindowTextA (hInput, source);
break;

case IDC_SUB:
strcat (source, "-");
SetWindowTextA (hInput, source);
break;

case IDC_MUL:
strcat (source, "*");
SetWindowTextA (hInput, source);
break;

case IDC_DIV:
strcat (source, "/");
SetWindowTextA (hInput, source);
break;

case IDC_DOT:
strcat (source, ".");
SetWindowTextA (hInput, source);
break;

case IDC_DEL:
source [strlen(source)-1] = '\0';
SetWindowTextA (hInput, source);
break;

case IDC_CLEAR:
strcpy (source, "\0");
SetWindowTextA (hInput, "0");
SetWindowTextA (hOut, "0");
break;

case IDC_LEFT_BRACKET:
strcat (source, "(");
SetWindowTextA (hInput, source);
break;

case IDC_RIGHT_BRACKET:
strcat (source, ")");
SetWindowTextA (hInput, source);
break;

case IDC_VALUE:
if (head != NULL)
{
destroy(head);//销毁表达式树
head = NULL;
}
if (!check1(source))
{
MessageBox (hDlg, TEXT("括号不匹配"), TEXT("提示"), 0);
break;
}
if (!check2(source))
{
MessageBox (hDlg, TEXT("表达式错误"), TEXT("提示"), 0);
break;
}
convert(source);
postfix(source);
head = Create_Tree (&head, source);
cal_result = cal(head);
sprintf (dest,"%.4lf",cal_result);
SetWindowTextA (hOut, dest);
break;

case IDCANCEL:
if (head != NULL)
{
destroy(head);
head = NULL;
}

DestroyWindow (hDlg);
// hwnd = NULL;
break;
}
return true;
case WM_CLOSE:
DestroyWindow (hDlg);
// hwnd = NULL;
break;
}
return DefWindowProc (hDlg, message, wParam, lParam) ;
}
...全文
101 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gameslq 2011-10-23
  • 打赏
  • 举报
回复

while (GetMessage (&msg, NULL, 0, 0))
{
if (!TranslateAccelerator (hwnd, hAccel, &msg))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
}

改为

while (GetMessage(&msg, NULL, NULL, NULL))
{
if (!IsWindow(hwnd) || !IsDialogMessage(hwnd, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

非模态对话框的消息有IsDialogMessage函数来传递和处理
stackoverlow 2011-10-23
  • 打赏
  • 举报
回复
求助啊各位帮看看怎么解决。。
schlafenhamster 2011-10-23
  • 打赏
  • 举报
回复
dlghwnd = CreateDialog (hInstance, MAKEINTRESOURCE(IDD_DIALOG), 0/ * hwnd */, DialogProc) ;
aiyaya730 2011-10-23
  • 打赏
  • 举报
回复
为什么只有非摸态才能加加速键?
摸态的也可以吧

我感觉既然摸态的可以,非摸态的不可以,
问题肯定是处在消息循环上了
stackoverlow 2011-10-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 korekara88730 的回复:]
我也新手,说的不一定对

这个计算器,如果模态对话框的话,正确吗?

模态对有内建的消息循环,只需要自己写对话框消息过程就可以了
非摸态对话框,不仅要自己写对话框消息过程,还要自己写消息循环,就类似主窗口的消息循环那样

建议LZ 先试试改成模态的好用不好用
[/Quote]
已经做好了的模态的能行,我是想改成非模态的,这样才能加加速键。。。但是改了之后就不行了
aiyaya730 2011-10-23
  • 打赏
  • 举报
回复
饿....

LZ 的程序好像只有一个窗口,当我楼上的话没说....
aiyaya730 2011-10-23
  • 打赏
  • 举报
回复
我也新手,说的不一定对

这个计算器,如果模态对话框的话,正确吗?

模态对有内建的消息循环,只需要自己写对话框消息过程就可以了
非摸态对话框,不仅要自己写对话框消息过程,还要自己写消息循环,就类似主窗口的消息循环那样

建议LZ 先试试改成模态的好用不好用

15,979

社区成员

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

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