• ExquisiteWnd


    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ///ExquisiteWnd.h

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    #pragma once

    #include <Windows.h>
    #include <tchar.h>
    #include <string>
    #include <vector>

    #include <stdio.h>
    #include <stdlib.h>
    using namespace std;

    #include "GDIEncapsulation.h"


    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    class CExquisiteWnd
    {
    public:
    CExquisiteWnd(HINSTANCE hInstance, HWND a_hParentWnd, RECT a_rect);
    ~CExquisiteWnd();

    static CExquisiteWnd * FindByWnd(HWND hWnd);

    HWND GetWnd();

    void SetRect(RECT a_rect);
    RECT GetRect();

    void SetVisible(bool a_bIfVisible);

    void Draw(HDC a_hdc);

    private:
    HINSTANCE m_hInstance;
    HWND m_hWnd;
    HWND m_hParentWnd;
    };

     

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ///ExquisiteWnd.cpp

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    #include "ExquisiteWnd.h"

    TCHAR szWindowClass[] = _T("ExquisiteWndClass");
    vector<CExquisiteWnd*> g_vecExquisition;

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch (message)
    {
    case WM_PAINT:
    {
    PAINTSTRUCT ps;
    HDC hdc;
    hdc = BeginPaint(hWnd, &ps);

    RECT rect;
    HDC hdcMem;
    HBITMAP hBmpMem;
    GetWindowRect(hWnd, &rect);
    int cx = (int)(rect.right - rect.left);
    int cy = (int)(rect.bottom - rect.top);
    hdcMem = CreateCompatibleDC(hdc);
    hBmpMem = CreateCompatibleBitmap(hdc, cx, cy);
    SelectObject(hdcMem, hBmpMem);
    BitBlt(hdcMem, 0, 0, cx, cy,hdc, 0, 0,SRCCOPY);

    CExquisiteWnd * pWnd = CExquisiteWnd::FindByWnd(hWnd);
    if (pWnd != NULL)
    {
    pWnd->Draw(hdcMem);
    }

    BitBlt(hdc, 0, 0, cx, cy, hdcMem, 0, 0, SRCCOPY);
    DeleteDC(hdcMem);
    DeleteObject(hBmpMem);

    EndPaint(hWnd, &ps);
    }
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    break;
    }

    return 0;
    }

    CExquisiteWnd::CExquisiteWnd(HINSTANCE hInstance, HWND a_hParentWnd, RECT a_rect)
    {
    // RegisterClassEx
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)GetStockObject(HOLLOW_BRUSH);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = szWindowClass;
    wcex.hIconSm = NULL;// LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

    if (!RegisterClassEx(&wcex))
    {
    MessageBox(NULL,
    _T("Call to RegisterClassEx failed!"),
    _T("ExquisiteWnd"),
    NULL);
    return;
    }

    m_hInstance = hInstance;

    //CreateWindow
    DWORD wndStyle;
    if (a_hParentWnd)
    {
    wndStyle = (WS_CHILD | WS_VISIBLE);
    }
    else
    {
    wndStyle = (WS_POPUP | WS_VISIBLE);
    }
    m_hWnd = CreateWindowEx(
    WS_EX_TRANSPARENT,
    szWindowClass,
    NULL,
    wndStyle,
    (int)a_rect.left, (int)a_rect.top,
    (int)(a_rect.right - a_rect.left), (int)(a_rect.bottom - a_rect.top),
    NULL,
    NULL,
    hInstance,
    NULL
    );

    if (!m_hWnd)
    {
    MessageBox(NULL,
    _T("Call to CreateWindow failed!"),
    _T("ExquisiteWnd"),
    NULL);

    return;
    }
    RegisterTouchWindow(m_hWnd, TWF_FINETOUCH);
    m_hParentWnd = a_hParentWnd;

    g_vecExquisition.push_back(this);
    }

    CExquisiteWnd::~CExquisiteWnd()
    {
    if (NULL != m_hWnd)
    {
    UnregisterTouchWindow(m_hWnd);
    DestroyWindow(m_hWnd);
    }
    vector<CExquisiteWnd*>::iterator iter;
    for (iter = g_vecExquisition.begin(); iter != g_vecExquisition.end(); iter++)
    {
    if (this == (*iter))
    {
    g_vecExquisition.erase(iter);
    break;
    }
    }
    }

    HWND CExquisiteWnd::GetWnd()
    {
    return m_hWnd;
    }

    CExquisiteWnd * CExquisiteWnd::FindByWnd(HWND hWnd)
    {
    if (NULL == hWnd) return NULL;
    for (int i = 0; i < g_vecExquisition.size(); i++)
    {
    if (g_vecExquisition[i]->GetWnd() == hWnd)
    return g_vecExquisition[i];
    }
    return NULL;
    }

    void CExquisiteWnd::SetRect(RECT a_rect)
    {
    MoveWindow(m_hWnd, (int)a_rect.left, (int)a_rect.top, (int)(a_rect.right - a_rect.left), (int)(a_rect.bottom - a_rect.top), TRUE);
    }
    RECT CExquisiteWnd::GetRect()
    {
    RECT rWnd;
    GetWindowRect(m_hWnd, &rWnd);
    return rWnd;
    }

    void CExquisiteWnd::SetVisible(bool a_bIfVisible)
    {
    if (a_bIfVisible)
    {
    ShowWindow(m_hWnd, SW_SHOW);
    }
    else
    {
    ShowWindow(m_hWnd, SW_HIDE);
    }
    }

    void CExquisiteWnd::Draw(HDC a_hdc)
    {
    if (NULL == m_hWnd) return;

    RECT rect;
    GetWindowRect(m_hWnd, &rect);
    int cx = (int)(rect.right - rect.left);
    int cy = (int)(rect.bottom - rect.top);
    COLORREF colorPen = RGB(0,153,51);
    COLORREF colorBrush = RGB(0,153,255);

    CGDIEncapsulation::GetInstance()->DrawLinearGradientRectangle(a_hdc, 0, 0, cx, cy, colorPen, colorBrush, 200, 2);
    //CGDIEncapsulation::GetInstance()->FillRoundRectangle(a_hdc, 50, 50, cx - 100, cy - 100, RGB(0, 0, 0));
    CGDIEncapsulation::GetInstance()->DrawRoundRectangle(a_hdc, 50, 50, cx - 100, cy - 100, RGB(255, 153, 0));

    RECT rImg;
    rImg.left = 100;
    rImg.top = 100;
    rImg.right = 100 + 84;
    rImg.bottom = 100 + 160;
    //CGDIEncapsulation::GetInstance()->DrawImage(a_hdc, _T("Probe_sel.png"), rImg);

    CGDIEncapsulation::GetInstance()->ShowText(a_hdc, _T("人生得意须尽欢,莫使金樽空对月!"),
    rImg, RGB(153, 255, 0), 22, 4, 1, 1, L"Arial", 0);

    }

     

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ///Main.cpp

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    #include "ExquisiteCtrls/ExquisiteWnd.h"

    /* *******************************
    * WinMain
    * Entry Function
    * *******************************/
    int WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd)
    {
    RECT rMainWnd;
    rMainWnd.left = 100;
    rMainWnd.top = 60;
    rMainWnd.right = (LONG)(100 + 567);
    rMainWnd.bottom = (LONG)(60 + 380);
    CExquisiteWnd mainWnd(hInstance,NULL, rMainWnd);
    HWND hMainWnd = mainWnd.GetWnd();

    //ShowWindow
    ShowWindow(hMainWnd, nShowCmd);
    UpdateWindow(hMainWnd);

    //Main message loop:
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }

    return (int)msg.wParam;
    }

  • 相关阅读:
    【转载】opencvVS2019配置方法
    windows.h头文件中改变光标位置的函数——SetConsoleCursorPosition
    五行代码解决猴子选大王问题
    AtCoder Beginner Contest 192
    ACM做题注意事项
    数据库部分重点
    数据库7-11章期末复习
    数据库4-6章期末复习
    数据库1-3章期末复习
    ICPC Central Russia Regional Contest (CRRC 19)
  • 原文地址:https://www.cnblogs.com/waterair/p/7412811.html
Copyright © 2020-2023  润新知