小弟用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;
}
鼠标点击程序还是在运行,就是棋子图片不显示,#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;
}
解决方案 »
- 解压ZIP代码
- 抄了一个小例子, 关于com的, 定义接口的时候报错, CoCreateInstance也有问题
- 关于CEdit控件自画的问题,在线等,谢谢!
- 问一个局域网简单的问题
- 请教关于CSerialPort写数据的问题
- JPG转换为BMP
- 哪位高手用VC++写过Windows服务程序啊,为什么里面不使用网络路径访问,打开文件时报错
- 如何判断一个字符串是GB还是BIG5,急急急,立即给分!
- 有关弹出式Menu的问题(请教)
- 这里的VERIFY是什么意思?是不是检查返回字符的正确性
- f:\英文vc++\vc6en\vc98\include\ios(9) : fatal error C1083: Cannot open include file: 'streambuf': No such file or directory
- 关于COleDateTime中的时间比较问题
HDC HDc;
HDc = GetDC(hwnd);
//白棋下,显示白棋光标
if(colorwhite)
{
SetCursor(hcursorwhite);
}else
{
SetCursor(hcursorblack);
}
drawmap(hwnd,HDc);
ReleaseDC(hwnd,HDc);
break;
case WM_PAINT:
小弟试了一下
还是不对我这么改了一下,有图片了。可是点击重新开始,图片又没有了,程序还是在运行,就是说它没有重绘了,可我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;
}
}
}
{
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]全赋为零,也就是没有棋子被显示,当然不会看到棋子了
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);
}