以下程序在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);
}

解决方案 »

  1.   

    1、需要进行类型转换
    2。PlaySound的使用应该要添加一个lib文件才行。
      

  2.   

    1、wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    2、winmm.lib在Dev中找不到,使用绝对路径或定义Dev的环境变量
      

  3.   

    #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)强制类型转换,却不行,现在却行了!
    难道是人品不好。。
      

  4.   

    messagebox是你自己写的,所以和unicode没关系
    进入if里面是因为你注册不成功
    你不时注释了一句话吗?
      

  5.   

    明白了,原来
    wndclass.hbrBackground的这个域不设置,后面就会注册失败,
    我还以为不设置也会有默认值的。
    我原来认为与unicode有关系是因为,
    那书上说,windows98运行unicode的程序,RegisterClass会失败,
    所以才有了那想法。。
    好了,揭帖。