小弟用WIN32写了个五子棋,可是棋子图片不显示,其他都正常,怎么办啊,
鼠标点击程序还是在运行,就是棋子图片不显示,#include <windows.h>
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg, WPARAM wParam,LPARAM lParam);//申明函数
void restart();//重新开始
void drawmap(HWND hwnd,HDC hdc,bool start);//画图
void over(POINT point);//逻辑变化
/**********************全局变量**********************/
HWND hwnd;
int wzq[19][19] = {0}; //棋盘数组
HINSTANCE b_hInstance = NULL;
HINSTANCE w_hInstance = NULL;
HBITMAP m_bmblack = (HBITMAP)LoadImage(b_hInstance,"bitmap2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);//黑棋位图
HBITMAP m_bmwhite = (HBITMAP)LoadImage(w_hInstance,"bitmap1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);//白棋位图
HCURSOR hcursorwhite = (HCURSOR)LoadImage(w_hInstance,"cursor2.cur",IMAGE_CURSOR,0,0,LR_LOADFROMFILE);//白棋光标
HCURSOR hcursorblack = (HCURSOR)LoadImage(b_hInstance,"cursor1.cur",IMAGE_CURSOR,0,0,LR_LOADFROMFILE);//黑棋光标
bool colorwhite = true;
HDC black_hdc;
HDC white_hdc;void drawmap(HWND hwnd,HDC hdc)
{
black_hdc = CreateCompatibleDC(hdc);
white_hdc = CreateCompatibleDC(hdc);
for(int i=0;i<19;++i)//画棋盘
{
MoveToEx(hdc,40,40+i*20,NULL);
LineTo(hdc,400,40+i*20);
MoveToEx(hdc,40+i*20,40,NULL);
        LineTo(hdc,40+i*20,400);
}
for(int n=0;n<19;n++)
{
for(int m=0;m<19;m++)
{
if(wzq[n][m] == 1)//显示白棋
{
SelectObject(white_hdc,m_bmwhite);
BitBlt(hdc,n*20+31,m*20+31,18,18,white_hdc,0,0,SRCCOPY); 
}
else if(wzq[n][m] == -1)//显示黑棋
{   
SelectObject(black_hdc,m_bmblack);
BitBlt(hdc,n*20+31,m*20+31,18,18,black_hdc,0,0,SRCCOPY); 
}
}
}
DeleteDC(black_hdc);
DeleteDC(white_hdc); 
}void restart() 
{
RECT rect;
for(int i=0;i<19;i++)
for(int j=0;j<19;j++)
wzq[i][j]=0;
    colorwhite=true;
GetClientRect(hwnd, &rect);
InvalidateRect(hwnd, &rect, TRUE);
}void over(POINT point)//逻辑变化
{
int x = (point.x-30)/20;
int y = (point.y-30)/20;
int a;
//水平判断
for(x=0;x<15;x++)
{
a = 0;
for(y=0;y<15;y++)
{
a = wzq[x][y]+wzq[x+1][y]+wzq[x+2][y]+wzq[x+3][y]+wzq[x+4][y];
//五个都是白 棋
if(a == 5)
{
MessageBox(hwnd,"白棋胜1!","Jerry",0);
restart();//重新开始
return;
}
//五个都是黑棋
if(a == -5)
{
MessageBox(hwnd,"黑棋胜1!","Jerry",0);
restart();
return;
}
}
}
//垂直判断
for(x=0;x<15;x++)
{
a = 0;
for(y=0;y<15;y++)
{
a = wzq[x][y]+wzq[x][y+1]+wzq[x][y+2]+wzq[x][y+3]+wzq[x][y+4];
if(a == 5)
{
MessageBox(hwnd,"白棋胜2!","Jerry",0);
restart();//重新开始
return;
}
if(a == -5)
{
MessageBox(hwnd,"黑棋胜2!","Jerry",0);
restart();
return;
}
}
}
//判断“\”方向
for(x=0;x<15;x++)
{
a = 0;
for(y=0;y<15;y++)
{
a = wzq[x][y]+wzq[x+1][y+1]+wzq[x+2][y+2]+wzq[x+3][y+3]+wzq[x+4][y+4];
if(a == 5)
{
MessageBox(hwnd,"白棋胜3!","Jerry",0);
restart();//重新开始
return;
}
if(a == -5)
{
MessageBox(hwnd,"黑棋胜3!","Jerry",0);
restart();
return;
}
}
}
//判断“/”方向
for(x=0;x<19;x++)
{
a = 0;
for(y=0;y<15;y++)
{
a = wzq[x][y]+wzq[x-1][y+1]+wzq[x-2][y+2]+wzq[x-3][y+3]+wzq[x-4][y+4];
if(a == 5)
{
MessageBox(hwnd,"白棋胜4!","Jerry",0);
restart();//重新开始
return;
}
if(a == -5)
{
MessageBox(hwnd,"黑棋胜4!","Jerry",0);
restart();
return;
}
}
}
}
LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
static POINT pt;
static bool benstart = false;
int px,py;
switch(uMsg)
{
case WM_CREATE: break;
case WM_COMMAND: break;
case WM_MOUSEMOVE:
break;
    case WM_LBUTTONDOWN:
pt.x = LOWORD(lParam);//取得鼠标x坐标
pt.y = HIWORD(lParam);//取得鼠标y坐标
px = (pt.x-30)/20;//指向中心位置
py = (pt.y-30)/20;
if(benstart = true)
{
if(pt.x>30 && pt.x<410 && pt.y>30 && pt.y<410) //是否在棋盘内 
{
if(colorwhite && wzq[px][py] == 0)
{  
wzq[px][py] = 1;//表示存在白棋
over(pt);//检查是否结束
colorwhite = false;//换黑棋下
}
else if(wzq[px][py] == 0)
{
wzq[px][py] = -1;
over(pt);
colorwhite = true;
}
}
} break;
case WM_LBUTTONUP:
HDC HDc;
HDc = GetDC(hwnd);
//白棋下,显示白棋光标
if(colorwhite)
{
SetCursor(hcursorwhite);
}else 
{
SetCursor(hcursorblack);
} ReleaseDC(hwnd,HDc);
break;
case WM_PAINT:
HDC hdc;
PAINTSTRUCT ps;
hdc = BeginPaint(hwnd,&ps);  
drawmap(hwnd,hdc);
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否真的结束?","Jerry",MB_YESNO))
{   
DestroyWindow(hwnd); 
}   
break;   
case  WM_DESTROY:  PostQuitMessage(0);
_CrtDumpMemoryLeaks();
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow )          

b_hInstance = w_hInstance = hInstance;
WNDCLASSEX wndcls;//窗口类实例化
wndcls.cbSize = sizeof(WNDCLASSEX);
wndcls.hIconSm = NULL;
wndcls.cbClsExtra=0;//类的附加信息即追加的内存空间
wndcls.cbWndExtra=0;//窗口的附加信息
wndcls.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH);//背景画刷句柄
wndcls.hCursor=(HCURSOR)LoadImage(hInstance,"",IMAGE_CURSOR,0,0,LR_LOADFROMFILE);//光标句柄
wndcls.hIcon=(HICON)LoadImage(hInstance,"game.ico",IMAGE_ICON,0,0,LR_LOADFROMFILE);//窗口标题栏图标
wndcls.hInstance=hInstance;//窗口类的实例句柄:用来表示该窗口属于哪个程序实例
wndcls.lpfnWndProc=WinSunProc;//函数指针:用来接收窗口的消息处理函数,跟消息过程函数必须同名
wndcls.lpszClassName="Jerry2007";//窗口类名
wndcls.lpszMenuName=NULL;//菜单名
wndcls.style=CS_HREDRAW | CS_VREDRAW;//窗口样式水平重画或垂直重画

if(!RegisterClassEx(&wndcls))
{
MessageBox(NULL,TEXT("This is error!"),"Jerry2007",MB_ICONWARNING);
return 0;
} hwnd=CreateWindow("Jerry2007","五子棋",WS_SYSMENU|WS_OVERLAPPED,0,0,450,450,NULL,NULL,hInstance,NULL);

if(!hwnd)
return false; ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd); MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
     {
          TranslateMessage(&msg) ;
          DispatchMessage(&msg) ;
     }
     return 0;
}

解决方案 »

  1.   

    看msdn,CreateCompatibleDC(hdc); 创建的时1x1的位图,需要使用createcompatiblebitmap();来创建它的大小,就是你五子图片的大小   
      

  2.   

    加上drawmap(hwnd,HDc);case   WM_LBUTTONUP:
    HDC   HDc;
    HDc   =   GetDC(hwnd);
    //白棋下,显示白棋光标
    if(colorwhite)
    {
    SetCursor(hcursorwhite);
    }else  
    {
    SetCursor(hcursorblack);
    }
    drawmap(hwnd,HDc);
    ReleaseDC(hwnd,HDc);
    break;
    case   WM_PAINT: 
      

  3.   


    小弟试了一下
    还是不对我这么改了一下,有图片了。可是点击重新开始,图片又没有了,程序还是在运行,就是说它没有重绘了,可我PAINT里有绘棋子的代码啊,怎么办啊 
         case   WM_LBUTTONDOWN: 
    pt.x   =   LOWORD(lParam);//取得鼠标x坐标 
    pt.y   =   HIWORD(lParam);//取得鼠标y坐标 
    px   =   (pt.x-30)/20;//指向中心位置 
    py   =   (pt.y-30)/20; 
    if(benstart   =   true) 

    if(pt.x> 30   &&   pt.x <410   &&   pt.y> 30   &&   pt.y <410)   //是否在棋盘内   

    if(colorwhite   &&   wzq[px][py]   ==   0) 

    SelectObject(white_hdc,m_bmwhite);
    BitBlt(hdc,px*20+31,py*20+31,18,18,white_hdc,0,0,SRCCOPY);   
    wzq[px][py]   =   1;//表示存在白棋 
    over(pt);//检查是否结束 
    colorwhite   =   false;//换黑棋下 

    else   if(wzq[px][py]   ==   0) 

    SelectObject(black_hdc,m_bmblack);
    BitBlt(hdc,px*20+31,py*20+31,18,18,black_hdc,0,0,SRCCOPY);
    wzq[px][py]   =   -1; 
    over(pt); 
    colorwhite   =   true; 


      

  4.   

    你那PAINT里确实有,但你有没触发WM_PAINT消息!
      

  5.   

    void   restart()   

    RECT   rect; 
    for(int   i=0;i <19;i++) 
    for(int   j=0;j <19;j++) 
    wzq[i][j]=0; 
            colorwhite=true; 
    GetClientRect(hwnd,   &rect); 
    InvalidateRect(hwnd,   &rect,   TRUE); 
    }
    你在重新开始的函数中,把wzq[i][j]全赋为零,也就是没有棋子被显示,当然不会看到棋子了
      

  6.   

    1、查看了你的代码,在WM_PAINT里面,只看到了画棋盘的drawmap,没有绘制棋子的代码case   WM_PAINT: 
    HDC   hdc; 
    PAINTSTRUCT   ps; 
    hdc   =   BeginPaint(hwnd,&ps);   
    drawmap(hwnd,hdc); 
    EndPaint(hwnd,&ps); 
    break; 2、你的restart函数把wzq[i][j]=0,没有棋子,当然看不到了void   restart()   

    RECT   rect; 
    for(int   i=0;i <19;i++) 
    for(int   j=0;j <19;j++) 
    wzq[i][j]=0; 
            colorwhite=true; 
    GetClientRect(hwnd,   &rect); 
    InvalidateRect(hwnd,   &rect,   TRUE);