windows刷新客户区的问题

hitcser01 2012-03-25 04:07:07

#include <windows.h>
#define DIVISIONS 5
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("Checker1") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;

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 = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;

if (!RegisterClass (&wndclass))
{
MessageBox ( NULL, TEXT ("Program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, TEXT ("Checker1 Mouse Hit-TestDemo"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;

ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
WPARAM wParam,LPARAM lParam)
{
static BOOL fState[DIVISIONS][DIVISIONS] ;
static int cxBlock, cyBlock ,nHit ;
static char szBuffer[59];
HDC hdc ;
int x, y ;
static int nx,ny;
PAINTSTRUCT ps ;
RECT rect ;

switch (message)
{
case WM_SIZE :
cxBlock = LOWORD (lParam) / DIVISIONS ;
cyBlock = HIWORD (lParam) / DIVISIONS ;
return 0 ;

case WM_LBUTTONDOWN :
x = LOWORD (lParam) / cxBlock ;
y = HIWORD (lParam) / cyBlock ;

if (nx==x&&ny==y)
{
nHit++;
hdc=BeginPaint(hwnd,&ps);
TextOut(hdc,10,10,szBuffer,wsprintf(szBuffer,"hit is :%d",nHit));
EndPaint(hwnd,&ps);
InvalidateRect (hwnd, &rect, FALSE) ;
}
else
{
InvalidateRect (hwnd, &rect, FALSE) ;
}

return 0 ;

case WM_PAINT :
hdc = BeginPaint (hwnd, &ps) ;

for (x = 0 ; x < DIVISIONS ; x++)
for (y = 0 ; y < DIVISIONS ; y++)
{
Rectangle (hdc, x * cxBlock, y * cyBlock, (x + 1) * cxBlock, (y + 1) * cyBlock) ;
}
TextOut(hdc,10,10,szBuffer,wsprintf(szBuffer,"hit is :%d",nHit));
srand(time(0));
nx=x=rand()%5;
ny=y=rand()%5;
fState[x][y]=1;
if ( fState [x][y] )
{
MoveToEx (hdc, x * cxBlock, y * cyBlock, NULL) ;
LineTo(hdc, (x+1) * cxBlock, (y+1) * cyBlock) ;
MoveToEx (hdc, x * cxBlock, (y+1) * cyBlock, NULL) ;
LineTo (hdc, (x+1) * cxBlock, y * cyBlock) ;
}
InvalidateRect (hwnd, NULL, FALSE) ;
Sleep(500);
fState[x][y]=0;
EndPaint (hwnd,&ps);

return 0 ;

case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

个人改编自原书源代码,想做成“打地鼠”的游戏,各位编译下就知道了。运行就可以发现问题。麻烦各位了,谢谢!
...全文
130 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hitcser01 2012-04-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

TextOut(hdc,10,10,szBuffer,wsprintf(szBuffer,TEXT("hit is :%d"),nHit));
TCHAR szBuffer[59];
你都没看到我改了一些语句。
[/Quote]真是十分抱歉,的确没有看出你所做的修改,对不起。
但是,您所提供的代码经过编译后任然不能正常刷新,也就是说那个X仍旧会卡住。和我之前遇到的问题一样,不知道您是否自己编译运行过。
我的系统:win7 x86 sp1 d 版 + codeblocks
Binzo 2012-03-30
  • 打赏
  • 举报
回复
TextOut(hdc,10,10,szBuffer,wsprintf(szBuffer,TEXT("hit is :%d"),nHit));
TCHAR szBuffer[59];
你都没看到我改了一些语句。
猪头小哥 2012-03-26
  • 打赏
  • 举报
回复
哥们,你工程没建错?win32项目(vs2010)我这有警告 但是没错误啊,运行的时候有个叉叉在动~~

还得改:
点“项目(V)”->最底下的那个“xxxxx 属性”
左边展开“配置属性”,点“常规”
把右边倒数第三个的“使用 Unicode 字符集”修改成“使用多字节字符集”,点确定
现在可以点上面的绿色三角形开始编译调试了,然后就运行起来产生一个窗口了。
注意一下,如果你把编译模式“Debug”改成“Release”,是还要设置一次字符集的,因为这两种编译模式的设置都是分开的。
hitcser01 2012-03-26
  • 打赏
  • 举报
回复
楼上的朋友,你的代码只加了一句:#include<time.h>吧,没有什么作用啊
Binzo 2012-03-25
  • 打赏
  • 举报
回复
#include <windows.h>
#include <time.h>
#define DIVISIONS 5
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("Checker1") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;

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 = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;

if (!RegisterClass (&wndclass))
{
MessageBox ( NULL, TEXT ("Program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow (szAppName, TEXT ("Checker1 Mouse Hit-TestDemo"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;

ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;

while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
WPARAM wParam,LPARAM lParam)
{
static BOOL fState[DIVISIONS][DIVISIONS] ;
static int cxBlock, cyBlock ,nHit ;
TCHAR szBuffer[59];
HDC hdc ;
int x, y ;
static int nx,ny;
PAINTSTRUCT ps ;
RECT rect ;

switch (message)
{
case WM_SIZE :
cxBlock = LOWORD (lParam) / DIVISIONS ;
cyBlock = HIWORD (lParam) / DIVISIONS ;
return 0 ;

case WM_LBUTTONDOWN :
x = LOWORD (lParam) / cxBlock ;
y = HIWORD (lParam) / cyBlock ;

if (nx==x&&ny==y)
{
nHit++;
hdc=BeginPaint(hwnd,&ps);
TextOut(hdc,10,10,szBuffer,wsprintf(szBuffer,TEXT("hit is :%d"),nHit));
EndPaint(hwnd,&ps);
InvalidateRect (hwnd, &rect, FALSE) ;
}
else
{
InvalidateRect (hwnd, &rect, FALSE) ;
}

return 0 ;

case WM_PAINT :
hdc = BeginPaint (hwnd, &ps) ;

for (x = 0 ; x < DIVISIONS ; x++)
for (y = 0 ; y < DIVISIONS ; y++)
{
Rectangle (hdc, x * cxBlock, y * cyBlock, (x + 1) * cxBlock, (y + 1) * cyBlock) ;
}
TextOut(hdc,10,10,szBuffer,wsprintf(szBuffer,TEXT("hit is :%d"),nHit));
srand(time(0));
nx=x=rand()%5;
ny=y=rand()%5;
fState[x][y]=1;
if ( fState [x][y] )
{
MoveToEx (hdc, x * cxBlock, y * cyBlock, NULL) ;
LineTo(hdc, (x+1) * cxBlock, (y+1) * cyBlock) ;
MoveToEx (hdc, x * cxBlock, (y+1) * cyBlock, NULL) ;
LineTo (hdc, (x+1) * cxBlock, y * cyBlock) ;
}
InvalidateRect (hwnd, NULL, FALSE) ;
Sleep(500);
fState[x][y]=0;
EndPaint (hwnd,&ps);

return 0 ;

case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
hitcser01 2012-03-25
  • 打赏
  • 举报
回复
请查看本站消息。
sdgsdgbbbb 2012-03-25
  • 打赏
  • 举报
回复
有QQ吗,我加你一下,我有个问题想请教你。
c87527124 2012-03-25
  • 打赏
  • 举报
回复
单步调试,现在忙
晚上帮你看看

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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