zoukankan      html  css  js  c++  java
  • <转载>Win32控制台工程中创建窗口

    有的时候,用控制台同步输出调试信息、程序状态量,比出Log、弹出报错对话框等方法来得有效。那么如何做到呢?如下:

    简而言之,用GetModuleHandle()函数获得当前程序实例句柄,其它地方与常见的Win32创建窗体方法相同。

    看MSDN中这句:


    If this parameter is NULL, GetModuleHandle returns a handle to the file used to create the calling process.

    所以“GetModuleHandle(NULL)”返回的就是当前程序实例句柄。

    #include <iostream>
    #include <tchar.h>
    #include <windows.h>
    
    #define MAX_STR 100
    
    // 全局变量:
    HINSTANCE hInst;                                             // 当前实例
    TCHAR szTitle[MAX_STR]       = _TEXT("Console_Win Demo");    // 标题栏文本
    TCHAR szWindowClass[MAX_STR] = _TEXT("Console_Win Demo");    // 主窗口类名
    
    // 此代码模块中包含的函数的前向声明:
    ATOM                MyRegisterClass(HINSTANCE hInstance);
    BOOL                InitInstance(HINSTANCE hInstance, int nCmdShow);
    LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int CreateMyWindow()
    {
        std::cout << "Console_Win Demo" << std::endl << std::endl;
        std::cout << "================================" << std::endl << std::endl;
    
        HINSTANCE hInstance = NULL;
        int       nCmdShow  = SW_SHOW;      // 该变量取值参见MSDN
    /*
        GetModuleHandle(NULL);
        这将返回自身应用程序句柄
    */
        hInstance = GetModuleHandle(NULL);
        std::cout << "hInstance: " << hInstance << std::endl;
        std::cout << "hInstance->unused: " << hInstance->unused << std::endl << std::endl;
        std::cout << "================================" << std::endl << std::endl;
    
        MSG msg;
    
        MyRegisterClass(hInstance);
    
        // 执行应用程序初始化:
        if (!InitInstance (hInstance, nCmdShow)) 
        {
            std::cout << "Error in InitInstance()!" << std::endl;
            return FALSE;
        }
    
        // 主消息循环:
        while (GetMessage(&msg, NULL, 0, 0)) 
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    
        return (int) msg.wParam;
    }
    
    //
    //  函数: MyRegisterClass()
    //
    //  目的: 注册窗口类。
    //
    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
        WNDCLASSEX wcex;
    
        wcex.cbSize = sizeof(WNDCLASSEX);
    
        wcex.style          = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc    = (WNDPROC)WndProc;
        wcex.cbClsExtra     = 0;
        wcex.cbWndExtra     = 0;
        wcex.hInstance      = hInstance;
        wcex.hIcon          = NULL;
        wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
        wcex.lpszMenuName   = NULL;
        wcex.lpszClassName  = szWindowClass;
        wcex.hIconSm        = NULL;
    
        return RegisterClassEx(&wcex);
    }
    
    //
    //   函数: InitInstance(HANDLE, int)
    //
    //   目的: 保存实例句柄并创建主窗口。
    //
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
        HWND hWnd;
    
        hInst = hInstance; // 将实例句柄存储在全局变量中
    
        hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    
        if (!hWnd)
        {
            return FALSE;
        }
    
        ShowWindow(hWnd, nCmdShow);
        UpdateWindow(hWnd);
    
        return TRUE;
    }
    
    //
    //  函数: WndProc(HWND, unsigned, WORD, LONG)
    //
    //  目的: 处理主窗口的消息。
    //
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        PAINTSTRUCT ps;
        HDC hdc;
    
        switch (message) 
        {
        case WM_CREATE:
            std::cout << "Hello! I'm a CONSOLE. The WINDOW is my baby." << std::endl;
            break;
        case WM_COMMAND:
            break;
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            EndPaint(hWnd, &ps);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            std::cout << "Goodbye!" << std::endl << std::endl;
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
    }
  • 相关阅读:
    【数据结构】线性表&&顺序表详解和代码实例
    【智能算法】超详细的遗传算法(Genetic Algorithm)解析和TSP求解代码详解
    【智能算法】用模拟退火(SA, Simulated Annealing)算法解决旅行商问题 (TSP, Traveling Salesman Problem)
    【智能算法】迭代局部搜索(Iterated Local Search, ILS)详解
    10. js时间格式转换
    2. 解决svn working copy locked问题
    1. easyui tree 初始化的两种方式
    10. js截取最后一个斜杠后面的字符串
    2. apache整合tomcat部署集群
    1. apache如何启动
  • 原文地址:https://www.cnblogs.com/ztteng/p/3430173.html
Copyright © 2011-2022 走看看