2012-04-04 11 views
11

私は、まっすぐなWin32をGUIプログラミングに使用することに関してある種の抽象的な質問があります。唯一の以前のGUI経験はJavaでSwingを使っていたので、ウィンドウがサイズ変更されたときに自動的にボタンのサイズや位置を変更するレイアウトマネージャーを持つことに慣れていました。 Win32 APIに組み込まれている類似のものがありますか?または、すべての再描画で絶対位置を使用してサイズと位置を手動で再計算する必要がありますか?私はMSDNドキュメントのレイアウト管理のようなものには遭遇していないので、実際にはこれを行う方法であると想定していますが、それらが迷っているかもしれない迷路のようなものです。Win32 GUIプログラム内のレイアウト

ありがとうございました!

+0

私は、純粋なWin32 APIコールに適応できるMFC用のコードをいくつか持っています:http://stackoverflow.com/a/5739620/5987 –

答えて

1

MFCは、GUI設計の難しい部分のほとんどを隠すwin32のラッパーです。 WYSIWYGのような形式でコントロールを作成し、配置することができるリソースエディタを提供します。

+1

MFCには高水準のコントロールレイアウトマネージャが含まれています。私はそれが本当にサイズ変更後のコントロールの位置を変えることに役立つことはありません。 –

+0

ポジショニング!=レイアウト – Mehrdad

4

いいえWin32 APIには、コントロールのサイズ変更と位置変更のコードは含まれていません。自分で書くか、図書館を利用する必要があります。マイクロソフトはVisual StudioのリソースエディタとMFC(APIのC++ラッパー)を提供していますが、どちらも実際の問題に対応していません(自動的にサイズ変更と位置変更も)。私はwxWidgetsを使用しています.WxWidgetsはMFCよりも一貫しており(私の意見では)、サイズ変更と位置変更に対処する "sizer"という概念があります。

+0

ご清聴ありがとう! –

4

ATL(Visual C++に同梱)とそれに対応してWTL(出荷されず、ダウンロードする必要があります)を参照する必要があります。

"まっすぐなWin32"にほぼ完全にコンパイルされ、素晴らしいC++ラッパーを提供します。彼らは非常に軽量です(ほぼの重量ではありませんが、実際には99%の呼び出しに対してDirect Win32です).WTLはMFCの機能を模倣するように設計されているため、まだかなり機能が豊富です。

あなたはC++とセミグッドでなければなりません。

最も簡単な方法は、

// Put ATL includes before here.. 
#include <atlcrack.h> // Include this from WTL for message map 
#include <atlframe.h> // Include this from WTL for CDialogResize 

class CYourDialog : CDialogImpl<CYourDialog>, CDialogResize<CYourDialog> 
{ 
    BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam) 
    { 
     this->DlgResize_Init();      // Initialize the positions 
    } 

    BEGIN_MSG_MAP_EX(CYourDialog) // Learn about message maps if you haven't 
     MSG_WM_INITDIALOG(OnInitDialog) 
     CHAIN_MSG_MAP(CDialogResize<CYourDialog>) // Chain to the parent 
    END_MSG_MAP() 

    BEGIN_DLGRESIZE_MAP(CYourDialog) 
     DLGRESIZE_CONTROL(IDOK, DLSZ_MOVE_Y)  // Layout for "OK" button 
    END_DLGRESIZE_MAP() 
}; 

DLGRESIZE_CONTROL()は、レイアウトの心臓部であるようなものでCDialogResize<CYourDialog>を使用することです - DLSZ_MOVE_Y、たとえば、あなたが縦にIDOK移動したいと述べています。あなたはそれらをグループ化することもできますが、それは難しい(時には私はどちらが起こっているのか理解していません)...しかし、いったんそれが正しいとすれば、実際にはそれほど悪くはありません。ここで


は、自己完結型の例です:):

#define IDD_DIALOG1      101 
#define IDR_RT_MANIFEST1    103 
:それをコンパイルするには

#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") 

#include <atlbase.h> 
extern CComModule _Module; 
#include <atlapp.h> 
#include <atlcrack.h> 
#include <atlwin.h> 
#include <atlframe.h> 
#include "resource.h" 

class CMyDialog : public CDialogImpl<CMyDialog>, CDialogResize<CMyDialog> 
{ 
public: 
    enum { IDD = IDD_DIALOG1 }; 

private: 
    BOOL OnInitDialog(CWindow wndFocus, LPARAM) 
    { 
     this->DlgResize_Init(); 
     return TRUE; 
    } 

    void OnOK(UINT, int, HWND) { this->EndDialog(ERROR_SUCCESS); } 
    void OnCancel(UINT, int, HWND) { this->EndDialog(ERROR_CANCELLED); } 

    BEGIN_MSG_MAP_EX(CMyDialog) 
     MSG_WM_INITDIALOG(OnInitDialog) 
     COMMAND_HANDLER_EX(IDOK, BN_CLICKED, OnOK) 
     COMMAND_HANDLER_EX(IDCANCEL, BN_CLICKED, OnCancel) 
     CHAIN_MSG_MAP(CDialogResize<CMyDialog>) 
    END_MSG_MAP() 

    BEGIN_DLGRESIZE_MAP(CMyDialog) 
     DLGRESIZE_CONTROL(IDOK, DLSZ_MOVE_X | DLSZ_MOVE_Y) 
     DLGRESIZE_CONTROL(IDCANCEL, DLSZ_MOVE_X | DLSZ_MOVE_Y) 
    END_DLGRESIZE_MAP() 
}; 

CComModule _Module; 

int WINAPI _tWinMain(
    HINSTANCE hInstance, HINSTANCE hInstPrevious, 
    LPTSTR lpCmdLine, int nCmdShow) 
{ 
    _Module.Init(NULL, hInstance); 
    { 
     CMyDialog dialog; 
     dialog.DoModal(); 
    } 
    _Module.Term(); 
} 

、あなたはまた、同じプロジェクトフォルダに次の内容のresource.hという名前のファイルが必要

Sample.rcという名前のファイルがプロジェクトに追加されました。このファイルはVisual Studioで編集でき、ダイアログレイアウト:

#include "resource.h" 

#define APSTUDIO_READONLY_SYMBOLS 
#include "afxres.h" 
#undef APSTUDIO_READONLY_SYMBOLS 
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) 
#ifdef _WIN32 
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US 
#pragma code_page(1252) 
#endif 
#ifdef APSTUDIO_INVOKED 
1 TEXTINCLUDE 
BEGIN 
    "resource.h\0" 
END 

2 TEXTINCLUDE 
BEGIN 
    "#include ""afxres.h""\r\n" 
    "\0" 
END 

3 TEXTINCLUDE 
BEGIN 
    "\r\n" 
    "\0" 
END 
#endif 
IDD_DIALOG1 DIALOGEX 0, 0, 316, 180 
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME 
EXSTYLE WS_EX_APPWINDOW 
CAPTION "Dialog" 
FONT 8, "MS Shell Dlg", 400, 0, 0x1 
BEGIN 
    DEFPUSHBUTTON "OK",IDOK,205,159,50,14 
    PUSHBUTTON  "Cancel",IDCANCEL,259,159,50,14 
END 
#ifdef APSTUDIO_INVOKED 
GUIDELINES DESIGNINFO 
BEGIN 
    IDD_DIALOG1, DIALOG 
    BEGIN 
     LEFTMARGIN, 7 
     RIGHTMARGIN, 309 
     TOPMARGIN, 7 
     BOTTOMMARGIN, 173 
    END 
END 
#endif 
#endif 
#ifndef APSTUDIO_INVOKED 
#endif 
+1

@NathanMcCrina:ATLは文字通りWin32用のC++インターフェイス/ラッパーです.C++を使用している場合は、CスタイルのAPIを使用すると難しくなります。あなたが悪い習慣に従うようにします(グローバル変数の多くは悪い考えですが、間違いやすい)。 DirectXについて:私は彼らが一緒にうまくフィットすると確信しています - それは同じことなので、結局のところWin32と変わりません。 ATLヘルプの完全な例がありますか(おそらくDirectXはなく、ダイアログを表示するだけでしょうか?)私はダイアログを作り、あなたにそれを示すことができます、それは本当にそれほど難しいことではありません。 – Mehrdad

+0

もちろん、例には言わないよ! –

+0

@NathanMcCrina:更新を参照してください。 – Mehrdad

3

Hereおよびhereこれは、実績のあるいくつかの例があります。ホイールを再構築する必要はありません。

関連する問題