初探GDI——基本框架(几何绘图)
来源:互联网 发布:爆菊 知乎 编辑:程序博客网 时间:2024/06/08 04:25
学习GDI基本框架及几何绘图之后,使用VS2015创建新Win32空项目。编译以下代码。实现 :生成800*600窗口,展示6个空心填充矩形、6条直线,颜色皆随机,填充样式随机。按下ESC刷新画面,同时播放WindowXP.wav音频文件。 可能是应为产生随机数的方法问题,使用图像刷新极限速度大概为1s每次。可能是同一秒内产生的随机数固定,故新值与旧值相同。在调试过程中,出现调用MessageBox无法弹出窗口,需按alt的问题,经查阅资料,最终断定为消息通道被WM_PAINT占用,导致。
原代码为:
switch (message) { //如果窗口更新 case WM_PAINT: break; //如果点击叉号 case WM_CLOSE: //弹出窗口判断是否选择YES if (IDYES == MessageBox(hwnd, L"是否退出程序?", L" ", MB_YESNO)) DestroyWindow(hwnd); break;
将 WM_PAINT分类删除可解决问题,或者给以内容填充。新代码为:
switch (message) { //如果窗口更新 case WM_PAINT: g_hdc = BeginPaint(hwnd, &paintstruct); Game_Paint(hwnd); EndPaint(hwnd, &paintstruct); ValidateRect(hwnd, NULL); break; //如果点击叉号 case WM_CLOSE: //弹出窗口判断是否选择YES if (IDYES == MessageBox(hwnd, L"是否退出程序?", L" ", MB_YESNO)) DestroyWindow(hwnd); break;
问题解决。 全部代码:
/*第一次使用GDI绘图2017/08/18生成800*600窗口,展示6个空心填充矩形、6条直线,颜色皆随机,填充样式随机。按下ESC刷新画面,同时播放WindowXP.wav音频文件。*///头文件#include <windows.h>#include <time.h> //用于生成随机种子#pragma comment (lib,"winmm.lib") //使用palaysound函数//全局变量int nWidth = 800, nHeight = 600;HDC g_hdc = NULL;HPEN g_hPen[7] = { 0 };HBRUSH g_hBrush[7] = { 0 };int g_iPenStyle[5] = { PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_DASHDOTDOT };int g_iBrushStyle[6] = { HS_BDIAGONAL,HS_CROSS,HS_DIAGCROSS,HS_FDIAGONAL,HS_HORIZONTAL,HS_VERTICAL };//函数声明LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);//窗口过程函数bool Game_Init(HWND hwnd);//初始化数据void Game_Paint(HWND hwnd);//绘图函数bool Game_CleanUp(HWND hwnd);//资源清理int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){//创建窗口类 WNDCLASSEX wndClass = {0}; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.cbSize = sizeof(WNDCLASSEX); wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); wndClass.hCursor = LoadCursor(nullptr, IDC_ARROW); wndClass.hIcon = LoadIcon(nullptr, IDI_APPLICATION); wndClass.hIconSm = LoadIcon(nullptr, IDI_APPLICATION); wndClass.hInstance = hInstance; wndClass.lpfnWndProc = WndProc; wndClass.lpszClassName = L"GDIdome"; wndClass.lpszMenuName = nullptr; wndClass.style = CS_HREDRAW | CS_VREDRAW;//注册窗口类 RegisterClassEx(&wndClass);//创建窗口 HWND hwnd; hwnd = CreateWindow(L"GDIdome", L"GDI小试", WS_OVERLAPPEDWINDOW , CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, nullptr, nullptr, hInstance, nullptr);//调用资源初始化 Game_Init(hwnd);//展示窗口 ShowWindow(hwnd, nCmdShow); MoveWindow(hwnd, NULL, NULL, nWidth, nHeight, true); UpdateWindow(hwnd);//消息循环 MSG msg = { 0 }; while (msg.message!=WM_QUIT) { if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return 0;}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ PAINTSTRUCT paintstruct; switch (message) { //如果检测到按键 case WM_KEYDOWN: //如果是ESC if (wParam == VK_ESCAPE) { //播放音频 PlaySoundW(L"WindowsXP", NULL, SND_FILENAME | SND_ASYNC); Game_CleanUp(hwnd); Game_Init(hwnd); } break; //如果窗口更新 case WM_PAINT: g_hdc = BeginPaint(hwnd, &paintstruct); Game_Paint(hwnd); EndPaint(hwnd, &paintstruct); ValidateRect(hwnd, NULL); break; //如果点击叉号 case WM_CLOSE: //弹出窗口判断是否选择YES if (IDYES == MessageBox(hwnd, L"是否退出程序?", L" ", MB_YESNO)) DestroyWindow(hwnd); break; //如果关闭窗口则关闭程序,清理资源 case WM_DESTROY: Game_CleanUp(hwnd); PostQuitMessage(0); break; default: return DefWindowProc(hwnd, message, wParam, lParam); break; } return 0;}bool Game_Init(HWND hwnd)//资源初始化{ //初始化种子 srand((unsigned)time(NULL)); //依次随机生成画笔,画刷句柄 for (int i=0;i<=6;i++) { g_hPen[i] = CreatePen(g_iPenStyle[rand() % 5], 10, RGB(rand() % 256, rand() % 256, rand() % 256)); g_hBrush[i] = CreateHatchBrush(g_iBrushStyle[rand() % 6], RGB(rand() % 256, rand() % 256, rand() % 256)); } //生成画面 Game_Paint(hwnd); return true;}void Game_Paint(HWND hwnd){ //获取设备环境 g_hdc = GetDC(hwnd); for (int i = 0; i <= 6; i++) { //画线 SelectObject(g_hdc, g_hPen[i]); MoveToEx(g_hdc, 715, 85 * i + 40, NULL); LineTo(g_hdc, 785, 85 * i + 40); //画空心填充矩形 SelectObject(g_hdc, g_hBrush[i]); Rectangle(g_hdc, 100 * i + 10, 40, 100 * i + 90, 560); } //释放设备环境 ReleaseDC(hwnd, g_hdc);}bool Game_CleanUp(HWND hwnd){ //依次释放变量 for (int i = 0; i <= 6; i++) { DeleteObject(g_hPen[i]); DeleteObject(g_hBrush[i]); } return true;}
阅读全文
0 0
- 初探GDI——基本框架(几何绘图)
- 初探GDI——基本框架(文字输出)
- 初探GDI——基本框架(载入位图)
- Windows编程基础与GDI绘图基本框架复习
- 使用GDI在windows下绘图(二)——GDI绘图方法
- MFC——GDI+绘图
- GDI基础介绍之几何绘图
- GDI绘图基本步骤总结
- GDI绘图基本,持续更新
- 使用GDI在windows中绘图(一)——windows GDI原理
- Android GDI基本框架
- MFC学习笔记——GDI绘图
- GDI绘图(一)
- 绘图效率完整解决方案——三种手段提高GDI/GDI+绘图效率
- 绘图效率完整解决方案——三种手段提高GDI/GDI+绘图效率
- openCV—基本绘图
- [转]VC: GDI绘图基本步骤总结
- C++ GDI绘图程序框架模板
- HDU2222
- PhotoView
- 阿里的STORM——JSTORM
- Typical Policy Evaluation Strategies in Model-free Policy Search
- 算法设计基础1.1思维的体操
- 初探GDI——基本框架(几何绘图)
- ShaderLab: SubShader
- Android ijkplayer的使用解析及播放器的制作
- 程序提交时出现Time Limit Exceeded时可以改一下试试的小地方
- 1030. 完美数列(25)
- 饿了么项目---8、关于iscoll的扩展 better scroll的使用----左右菜单联动(2)
- 将PDF文件进行文件的编辑需要利用什么软件
- 强连通缩点 hdu3072
- Unity入门操作_Time类_004