我是一名经验丰富的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 举报,一经查实,本站将立刻删除。