2011-10-19 5 views
3

私は経験豊富なGUI C#プログラマーで、CLIのためのC/C++の経験があります。C#WinFormsのようなC++ Windows APIプログラムを構成する方法

私は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用のチュートリアルやコードサンプルが多数見つかりませんでした。

誰かがスケルトンコードを投稿したり、これが一般的にどのように達成されているかを説明するチュートリアルにリンクしてください。

答えて

2

以下に示すような独自の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); 
    } 
}; 

また、終了条件も含めてください。

2

Windows API自体はCであり、C++ではありません。

C++の場合、MFC(推奨しません)、または管理された.NET(ネイティブC++ではない)またはQTなどの他のライブラリの1つと、新しいWindowsランタイム(Windows 8 http://msdn.microsoft.com/en-us/library/windows/apps/hh464942%28v=vs.85%29.aspx

+0

なぜMFCは推奨されていませんか? – scdmb

+8

C++が好きなら、MFCを使用しません。そのマクロの完全な誤解されたアプローチは、マクロ、非互換性などに満ちており、成熟しています - 投票のおかげで... –

1

winapi用の単純なC++ラッパーとして存在するフレームワークを調べる場合は、WTLを参照してください。

+0

WTLはATLを拡張します。 ATLなしでWTLを使用することは可能ですか? – user1002358

関連する問題