微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何构建C#WinForms等C Windows API程序

我是一名经验丰富的GUI C#程序员,并且仅具有CLI的C/C++经验.

我正在使用C教我自己的原生Windows API.我能够创建带按钮和输入字段等的窗口;单击按钮并键入文本等时执行操作.

但是,到目前为止我所做的一切都是在没有使用类的单个c或cpp文件中.

在C#中,我将创建扩展Form的类:

public class MyForm : Form { }

然后像这样打开它:

MyForm myForm = new MyForm();
myForm.ShowDialog();

要么:

new MyForm().ShowDialog();

要么:

Application.Run(new MyForm());

然而,使用我的平面文件c / cpp方法我只有一个WinMain,它注册我的窗口类,创建窗口,消息循环只是搅拌.在我学习基础知识时,这对小程序来说并不可怕,但显然我希望能像C#中那样做得更好.

我没有找到本地Windows API的许多教程或代码示例,以显示通常如何完成此操作.

有人可以发一些骨架代码和/或链接一个教程,解释这是如何通常完成的?

解决方法:

我使用了自己的Window类,类似于下面显示的类.这是a reply I poseted for a different question,但你可能会觉得这很有用.所以这里是:

#pragma once

#include <windows.h>
#include <process.h>
#include <iostream>

using namespace std;

static const char *g_AppName  = "Test";

class CMyWindow
{
    HWND  _hWnd;
    int _width;
    int _height;
public:
    CMyWindow(const int width,const int height):_hWnd(NULL),_width(width),_height(height)
    {
        _beginthread( &CMyWindow::thread_entry, 0, this);
    }

    ~CMyWindow(void)
    {
        SendMessage(_hWnd, WM_CLOSE, NULL, NULL);
    }


private:
    static void thread_entry(void * p_userdata)
    {
        CMyWindow * p_win = static_cast<CMyWindow*> (p_userdata);
        p_win->create_window();
        p_win->message_loop();
    }

    void create_window()
    {
        WNDCLASSEX wcex;

        wcex.cbSize         = sizeof(WNDCLASSEX);
        wcex.style          = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc    = &CMyWindow::WindowProc;
        wcex.cbClsExtra     = 0;
        wcex.cbWndExtra     = 0;
        wcex.hInstance      = GetModuleHandle(NULL);
        wcex.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
        wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground  = (HBrush)(COLOR_WINDOW+1);
        wcex.lpszMenuName   = NULL;
        wcex.lpszClassName  = g_AppName;
        wcex.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);

        RegisterClassEx(&wcex);

        _hWnd = CreateWindow(g_AppName, g_AppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, GetModuleHandle(NULL), NULL);

        ShowWindow(_hWnd, SW_SHOWDEFAULT);
        UpdateWindow(_hWnd);
    }

    void message_loop()
    {
        MSG msg = {0};

        while (GetMessage(&msg, NULL, 0, 0))
        {
            if(msg.message == WM_QUIT)
            {
                break;
            }

            TranslateMessage(&msg);
            dispatchMessage(&msg);
        }
    }

    static LRESULT WINAPI WindowProc(HWND hWnd, UINT uMsg, WParaM wParam, LParaM lParam)
    {
        switch(uMsg)
        {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        case WM_POWERbroADCAST:
            {
                //power management code here
            }

        }

        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
};

还要确保包含退出条件.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐