初探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;}
原创粉丝点击