window console窗口创建绘图程序(小游戏)的一般过程
2013-05-03 17:59
405 查看
console也是窗体,自然也可以在其中画图,但是console窗体与windows窗体又有不同,主要如下:
1 console窗体是由window内部产生的,很多细节并没有暴露给用户,所以有很多事用户干不了,比如自己没办法指定回调函数,这就意味着无法改变默认的消息处理方式。
2 console窗体中有个富文本编辑框(?)
3 windows窗体中画图主要是通过WM_PAINT消息实现的,但是console中由于没法修改回调函数,因此无法操作WM_PAINT消息,绘图只能手工绘制,同时刷新时也需要自己写刷新语句。在console中要实现定时刷新可以通过SetTimer()+InvalidateRect() 来实现。通过观察发现,使用此方法会出现,显示的内容一闪而过,并不能停留。(解决方法从下面程序中说明)
动态绘制图像(游戏)的一般步骤:(利用定时器)
1,设置console样式
2,创建定时器,并分发定时器产生的消息
3,实现定时器指定的回调函数,实现不断绘制
tip:在实现重绘时,由于不能通过WM_PAINT实现,可通过invalidaterect函数擦除console窗体上的图像,然后重新绘制
1 console窗体是由window内部产生的,很多细节并没有暴露给用户,所以有很多事用户干不了,比如自己没办法指定回调函数,这就意味着无法改变默认的消息处理方式。
2 console窗体中有个富文本编辑框(?)
3 windows窗体中画图主要是通过WM_PAINT消息实现的,但是console中由于没法修改回调函数,因此无法操作WM_PAINT消息,绘图只能手工绘制,同时刷新时也需要自己写刷新语句。在console中要实现定时刷新可以通过SetTimer()+InvalidateRect() 来实现。通过观察发现,使用此方法会出现,显示的内容一闪而过,并不能停留。(解决方法从下面程序中说明)
动态绘制图像(游戏)的一般步骤:(利用定时器)
1,设置console样式
2,创建定时器,并分发定时器产生的消息
3,实现定时器指定的回调函数,实现不断绘制
tip:在实现重绘时,由于不能通过WM_PAINT实现,可通过invalidaterect函数擦除console窗体上的图像,然后重新绘制
#include <conio.h> #include <stdio.h> #include <tchar.h> #include <windows.h> #include <iostream> #include <winuser.h> #include <time.h> using namespace std; #define IDT_1 1 WINBASEAPI HWND WINAPI GetConsoleWindow (); HWND hWnd=GetConsoleWindow(); //3处理定时器指定的回调函数 void CALLBACK myTimerProc(HWND hwnd,UINT msg,UINT_PTR idEvent,DWORD dwTime) { //此函数的主要作用是清屏同时重绘,用到sleep(30)的原因是,当使用invalidaterect时,屏幕被清除了,同时给console窗口传递了一个wm_paint消息,此消息执行默认操作 //即什么也不画,如果此时直接运行下面的绘图语句绘图,由于console窗体是由一个ui线程控制的(不同于此main线程),其可能会延迟一段时间执行,而如果不采用sleep方 //法,下面的绘图操作可能早于wm_paint的响应,导致先画完了然后wm_paint响应了(画空,相当于把窗口又清除了),会出现闪烁的现象。 RECT r={0,0,79,24}; InvalidateRect(hwnd,&r,TRUE);//清除屏幕,同时发送wm_paint消息(什么也不画) Sleep(30);//等待30ms让ui线程先完成wm_paint的响应 //绘图语句 srand((unsigned) time(NULL)); int j=rand()%30; HDC hDc=GetDC(hWnd); for(int i=j;i<1000;i+=20) { Rectangle(hDc,i,i,i+10,i+10); } ReleaseDC(hWnd,hDc); } void main(int argc,char *argv[]) { //1 修改console的样式 //删除右侧的滚动条 HANDLE hConsole = ::GetStdHandle(STD_OUTPUT_HANDLE); COORD dwSize = {80, 26}; ::SetConsoleScreenBufferSize(hConsole, dwSize); SMALL_RECT rc = {0, 0, 79, 25}; ::SetConsoleWindowInfo(hConsole, TRUE, &rc); SetConsoleTitle("run the snake"); //设置背景色和前景色 system("color 3d"); //2 设置定时器,并分发定时器产生的WM_TIMER消息。 int ii=SetTimer(0,IDT_1,800,(TIMERPROC)myTimerProc); MSG msg; while(GetMessage(&msg,NULL,0,0)) { if(msg.message==WM_TIMER) DispatchMessage(&msg); } KillTimer(hWnd,ii); }
相关文章推荐
- MFC程序的启动过程——先全局对象theApp(第一入口),后WinMain(真正入口),会引爆pApp->InitInstance从而创建窗口(程序员入口)
- 学MFC之前必须会的金典创建窗口程序的过程代码
- Android应用程序窗口(Activity)的绘图表面(Surface)的创建过程分析
- MFC程序对win32的封装总结(窗口类的注册,窗口的创建,窗口的窗口过程指定)
- Android应用程序窗口(Activity)的绘图表面(Surface)的创建过程分析
- MFC程序对win32的封装总结(窗口类的注册,窗口的创建,窗口的窗口过程指定)
- Android应用程序窗口(Activity)的绘图表面(Surface)的创建过程分析
- Android应用程序窗口(Activity)的绘图表面(Surface)的创建过程分析
- Android应用程序窗口(Activity)的绘图表面(Surface)的创建过程分析
- Windows程序设计(SDK)窗口过程---程序 的关闭
- Android中窗口的创建过程
- vc++ 深入浅出 窗口创建过程
- 创建一个窗口程序(JFrame)
- VC++窗口的创建过程
- Android应用程序窗口(Activity)的视图对象(View)的创建过程分析
- Android应用程序窗口(Activity)的窗口对象(Window)的创建过程分析(转)
- win32汇编--创建窗口程序(RadAsm)
- 一个简单的WCF程序创建过程
- Chromium网页绘图表面(Output Surface)创建过程分析
- win32程序窗口的创建