windows程序设计入门问题;

hastings 2008-01-10 06:20:52
以下程序在Dev下运行,执行的却是MessageBox()的代码!!!
并且如果注释掉的两句加上的话编译不过,错误标注在边上。
但是,在VC中却能完美运行。这是为什么???
#include<windows.h>
#include<stdio.h>
#include<tchar.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
HRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);//窗口过程
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int nShowCmd)
{
static TCHAR szAppName[]=_T("HelloWindows");
HWND hwnd;
WNDCLASS wndclass;
MSG msg;
/////////////////////////////
wndclass.style=CS_HREDRAW|CS_VREDRAW;
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=GetStockObject(WHITE_BRUSH);//invalid conversion from `void*' to `HBRUSH__*'
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=szAppName;
////////////////////////////
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,_T("此电脑不支持Unicode程序"),_T("消息标题"),MB_OKCANCEL|MB_ICONQUESTION);
return 0;
}
hwnd=CreateWindow(szAppName,_T("程序标题"),WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,400,300,
NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,nShowCmd);
UpdateWindow(hwnd);
///////////////////////////
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
HRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)//窗口过程
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(message)
{
case WM_CREATE:
// PlaySound(_T("01.wav"),NULL,SND_FILENAME|SND_ASYNC);//[Linker error]undefined reference to `PlaySoundA@12'
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);
DrawText(hdc,_T("Made by Hastings"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
...全文
121 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hastings 2008-01-10
  • 打赏
  • 举报
回复
明白了,原来
wndclass.hbrBackground的这个域不设置,后面就会注册失败,
我还以为不设置也会有默认值的。
我原来认为与unicode有关系是因为,
那书上说,windows98运行unicode的程序,RegisterClass会失败,
所以才有了那想法。。
好了,揭帖。。。。
shakaqrj 2008-01-10
  • 打赏
  • 举报
回复
messagebox是你自己写的,所以和unicode没关系
进入if里面是因为你注册不成功
你不时注释了一句话吗?
hastings 2008-01-10
  • 打赏
  • 举报
回复
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
我刚才突发奇想,把以上两句改成了以下两句,
#include "D:\\Microsoft Visual Studio\\VC98\\Include\\mmsystem.h"
#pragma comment(lib,"D:\\Microsoft Visual Studio\\VC98\\libwinmm.lib")
结果一大堆错误,算了不搞了,反正那本书是假定我们用VC来编代码的。还是用VC来学
windows吧。。。。^_^。。。。

另外,谁能告诉我,为什么刚才在Dev上执行上述代码,却出来:
MessageBox(NULL,_T("此电脑不支持Unicode程序"),_T("消息标题"),MB_OKCANCEL|MB_ICONQUESTION);
这么个结果。但我没有用UNICODE标识符编译程序呀,即使用了,我的XP也应该能运行这程序呀。
现在我关了一下Dev吃了个饭回来后,却能出来窗口了!
而且,我也曾试着用(HBRUSH)GetStockObject(WHITE_BRUSH)强制类型转换,却不行,现在却行了!
难道是人品不好。。
shakaqrj 2008-01-10
  • 打赏
  • 举报
回复
类型转换即可
播放声音文件现在暂时注释掉
等看到后面再研究
txk1452 2008-01-10
  • 打赏
  • 举报
回复
1、wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
2、winmm.lib在Dev中找不到,使用绝对路径或定义Dev的环境变量
iyranly 2008-01-10
  • 打赏
  • 举报
回复
1、需要进行类型转换
2。PlaySound的使用应该要添加一个lib文件才行。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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