为什么这个通用对话框不能显示?

patron 2006-04-06 05:14:13
我是一个初学者,正在学习使用Windows API函数进行可视化编程。我照着书《Visual C++ 面向对象与可视化程序设计》写了一个“打开”和“另存为”的通用对话框程序,编译通过,窗口出来了,但是点“文件”菜单中的“打开”和“另存为”都没有反应,没有对话框弹出,请问是什么原因?

//代码如下:
//1.cpp

//////////////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <commdlg.h>
#include <stdio.h>
#include <stdlib.h>
#include "2.h"

OPENFILENAME ofn;
HINSTANCE hInst;
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{
HWND hwnd;
MSG Msg;
HACCEL hAccel;
WNDCLASS wndclass;
char lpszMenuName[]="Menu";
char lpszClassName[]="ͨÓöԻ°¿ò";
char lpszTitle[]="ͨÓöԻ°¿òʾÀý";

wndclass.style=0;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=lpszMenuName;
wndclass.lpszClassName=lpszClassName;

if(!RegisterClass(&wndclass))
{
MessageBeep(0);
return FALSE;
}
hInst=hInstance;

hwnd=CreateWindow(lpszClassName,lpszTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);

ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);

hAccel=LoadAccelerators(hInst,lpszMenuName);

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

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static char szFilter[]="Text Files (*.TXT)\0*.txt\0 All Files(*.*)\0*.*\0\0";
static char lpstrFileName[]="";
switch(message)
{
case WM_CREATE:
ofn.lStructSize=sizeof(OPENFILENAME);
ofn.hwndOwner=hwnd;
ofn.hInstance=NULL;
ofn.lpstrFilter=szFilter;
ofn.lpstrCustomFilter=NULL;
ofn.nMaxCustFilter=0;
ofn.nFilterIndex=1;
ofn.lpstrFile=NULL;
ofn.nMaxFile=0;
ofn.lpstrFileTitle=NULL;
ofn.nMaxFileTitle=0;
ofn.lpstrInitialDir=NULL;
ofn.lpstrTitle=NULL;
ofn.Flags=0;
ofn.nFileOffset=0;
ofn.nFileExtension=0;
ofn.lpstrDefExt=NULL;
ofn.lCustData=0;
ofn.lpfnHook=NULL;
ofn.lpTemplateName=NULL;
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_NEW:
break;
case IDM_OPEN:
ofn.lpstrFile=lpstrFileName;
ofn.Flags=OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY;
ofn.lpstrTitle="´ò¿ª";
GetOpenFileName(&ofn);
break;
case IDM_SAVEAS:
ofn.lpstrFile=lpstrFileName;
ofn.Flags=OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT;
ofn.lpstrTitle="Áí´æΪ";
GetSaveFileName(&ofn);
break;
case IDM_CLOSE:
break;
case IDM_EXIT:
SendMessage(hwnd,WM_DESTROY,0,0);
break;
case IDM_ABOUT:
MessageBox(hwnd,"ͨÓöԻ°¿òʾÀý","¹ØÓÚ",MB_OK);
break;
}
break;

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

//3.rc资源程序代码:
#include <windows.h>
#include "2.h"
MENU MENU DISCARDABLE
BEGIN
POPUP "文件(&F)"
BEGIN
MENUITEM "新建(&N) \t Ctrl+N", IDM_NEW
MENUITEM "打开(&O) \t Ctrl+O", IDM_OPEN
MENUITEM "关闭(&C)", IDM_CLOSE
MENUITEM SEPARATOR
MENUITEM "另存为(&A)", IDM_SAVEAS
MENUITEM SEPARATOR
MENUITEM "退出(&X)", IDM_EXIT
END
POPUP "帮助(&H)"
BEGIN
MENUITEM "关于(&A)...", IDM_ABOUT
END
END

MENU ACCELERATORS MOVEABLE PURE
BEGIN
"N", IDM_NEW
"O", IDM_OPEN
"S", IDM_SAVEAS
END

ABOUT DIALOG DISCARDABLE 50, 50, 100, 50
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU|WS_VISIBLE
CAPTION "关于"
FONT 12, "楷体"
BEGIN
CTEXT "Windows非模态对话框",-1,13,10,80,10
DEFPUSHBUTTON "确定",IDOK,35,30,30,12
END

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

//2.h头文件代码:
#define IDM_NEW 10
#define IDM_OPEN 11
#define IDM_CLOSE 12
#define IDM_SAVEAS 13
#define IDM_EXIT 14
#define IDM_ABOUT 15
...全文
225 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yongdu 2006-04-07
  • 打赏
  • 举报
回复
ofn.lpstrFile和ofn.nMaxFile指定返回的选择的文件名缓冲区和大小,不能为空,所以改为:
static char lpstrFileName[256]={0};

ofn.nMaxFile=256;
就好了
patron 2006-04-07
  • 打赏
  • 举报
回复
谢谢两位大哥的指点,运行成功了。
菜牛 2006-04-06
  • 打赏
  • 举报
回复
static char lpstrFileName[]="";
不对
ofn.nMaxFile=0;
不对

15,979

社区成员

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

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