#undef WINVER
#define WINVER 0x5000
#include <afxwin.h>
#include <Windows.h>
#include <Windowsx.h>
//全局变量定义区//
MSG msg;
HINSTANCE hInst;
HWND hWnd;
HDC hdc;
HDC mdc;
HBITMAP hbmp;
HBITMAP hbmp1;
RECT ClinetRect;
//****自定义绘画函数*********************//
void MyPaint(HDC hdc)//一般装载图片
{
BitBlt(hdc,0,0,600,450,mdc,0,0,SRCCOPY);//贴图
}
void MyPaint1(HDC hdc)//透明效果
{ BitBlt(hdc,100,100,600,450,mdc,100,0,SRCAND);//贴图
BitBlt(hdc,100,100,600,450,mdc,0,0,SRCPAINT);//贴图
}//****装载图片***************************//
void LoadMyImage(CString Image_name,int width,int height)
{
DeleteObject(hbmp);
hbmp=(HBITMAP)LoadImage(NULL,Image_name,IMAGE_BITMAP,width,height,LR_LOADFROMFILE);
if(hbmp==NULL)
{
AfxMessageBox("无法正确加载图片");
}
}
//****消息处理函数***********************//
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
switch(message)
{
case WM_CREATE:

case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
//AnimateWindow(hWnd, 500, AW_BLEND); //淡入图片0.5秒
MyPaint(hdc);
EndPaint(hWnd,&ps);
case WM_DESTROY:
DeleteDC(mdc);
DeleteObject(hbmp);
//AnimateWindow(hWnd, 500, AW_BLEND | AW_HIDE); //淡出图片0.5秒
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;}
//****定义及注册窗口类别函数*************//
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=0;
wcex.hInstance=hInstance;
wcex.hIcon=NULL;
wcex.hCursor=NULL;
wcex.hCursor=LoadCursor(NULL,IDC_ARROW);
wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszClassName=(LPCTSTR)"canvas";//类别名称
wcex.lpszMenuName=NULL;
wcex.hIconSm=NULL;
return RegisterClassEx(&wcex);
}//****初始化函数*************************//
BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)
{

hInst=hInstance;
hWnd=CreateWindow((LPCTSTR)"canvas",(LPCTSTR)"绘图窗口",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,600,450,NULL,NULL,hInstance,NULL);
if(!hWnd)
{
return FALSE;
}
MoveWindow(hWnd,200,200,600,450,true);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
hdc=GetDC(hWnd);
hbmp1=CreateCompatibleBitmap(hdc,600,450);
SelectObject(mdc,hbmp1);
mdc=CreateCompatibleDC(hdc);
LoadMyImage("仙剑启动画面.bmp",600,450);
SelectObject(mdc,hbmp);
/*MyPaint(hdc);*/                       ??如果这里不添加这句话,为什么连图片都不显示出来,
LoadMyImage("恐龙.bmp",100,100);
SelectObject(mdc,hbmp);
MyPaint1(hdc);
ReleaseDC(hWnd,hdc);
return true;
}//****主程序*****************************//
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{

MyRegisterClass(hInstance);
//运行初始化函数//
if(!InitInstance(hInstance,nCmdShow))
{return FALSE;}
//消息循环//
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

解决方案 »

  1.   

    case WM_PAINT:  少了一个returne 0;WM_CREATE: 也应该有一个吧、
      

  2.   

    请问一下:为什么我少写了return 0,窗口会自动关闭呢?
    还有,
    LoadMyImage("仙剑启动画面.bmp",600,450);
    SelectObject(mdc,hbmp);
    /*MyPaint(hdc);*/          ??如果这里不添加这句话,为什么连图片都不显示出来,只是一个空白窗口,我的本意是先加载一张背景图,然后再加载一张恐龙的图片,如果这句话写上了,等一下背景图和恐龙图都出来了,但是窗口重画时,背景图就不见了?
    LoadMyImage("恐龙.bmp",100,100);
    SelectObject(mdc,hbmp);
    MyPaint1(hdc);
      

  3.   

    CASE WM_CREATE:里面为什么没有break? MyPaint1函数应该放在循环里,也就是说当没有消息的时候,会一直执行函数重画,你这样只会在窗口创建的时候画一次,
      

  4.   

    CASE WM_CREATE:这个消息不是在窗口创建的时候才会发出吗?那为什么还会一直执行函数呢?
      

  5.   

    你界面闪一次是因为你第一次调用SHOWWINDOW  和UPDATEWINDOW这两个函数。
    这个时候会显示一次,又会发送一个WM_PAINT消息、然后由于WM_PAINT消息没有break;
    所以会直接destroy掉。
      

  6.   

    不是放在CREATE里面,你可以把while(getmessage)的结构改一下,在WHILE里加个if else语句,if用来接收消息,else里面重画
      

  7.   

    至于那个窗口重画过后应该写一个WM_SIZE ,和WM_PAINT 消息里去保持界面。
    /////
    hdc=GetDC(hWnd);
    hbmp1=CreateCompatibleBitmap(hdc,600,450);
    SelectObject(mdc,hbmp1);
    mdc=CreateCompatibleDC(hdc);
    LoadMyImage("仙剑启动画面.bmp",600,450);
    SelectObject(mdc,hbmp);
    /*MyPaint(hdc);*/ ??如果这里不添加这句话,为什么连图片都不显示出来,
    LoadMyImage("恐龙.bmp",100,100);
    SelectObject(mdc,hbmp);
    MyPaint1(hdc);
    ReleaseDC(hWnd,hdc);
    //////
    这段应该写在WM_PAINT 消息里吧。
      

  8.   

            MSG msg;
    ZeroMemory(&msg,sizeof(msg));
    while(msg.message != WM_QUIT)
    {
    if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    else
    {
    Sleep(33);
    MyPaint1();
        }
    }
    把这些代码放上去替换掉你原来的while循环。
      

  9.   

    你自己也说了窗口重画后背景就不见了,所以说再你窗口重画的时候肯定是接收的WM_PAINT消息。而你再WM_PAINT中又没有做这方面的操作,这样的话背景岂不是被重画了?(也就是没有了)。
      

  10.   

    不是可以建立一个与当前DC相兼容的DC,然后2张图片都放到该DC中,在显示出来,那这样子为什么背景图不见了,而在背景图上面的恐龙的图片还在?