○WINDOWSX あまり知られていないが、VCにはWINDOWSX.Hというインクルードファイルが 用意されていて、このヘッダにはいろいろなマクロが定義されている。以下 では、このヘッダに定義されているマクロの内の一部を紹介する。 モジュールハンドル: HMODULE GetInstanceModule(HINSTANCE hInstance); /* インスタンスハンドルからモジュールハンドルを得る */ メモリ: HGLOBAL GlobalPtrHandle(LPCVOID lp); /* ポインタがさしているメモリオブジェクトのメモリハンドルを得る */ BOOL GlobalLockPtr(LPCVOID lp); /* ポインタがさしているメモリオブジェクトのロックカウントをインクリメントするする */ BOOL GlobalUnlockPtr(LPCVOID lp); /* メモリオブジェクトのロックカウントをデクリメントする */ LPVOID GlobalAllocPtr(UINT fuFlags, DWORD cbBytes); /* 移動可能メモリオブジェクトを割り当て、これをロックしてポインタを返す */ LPVOID GlobalReallocPtr(LPCVOID lp, DWORD cbNew, UINT flags); /* GlobalAllocPtrで割り当てたメモリオブジェクトの再割り当てを行い、ロックした結果のポインタを返す */ BOOL GlobalFreePtr(LPCVOID lp); /* GlobalAllocPtrで割り当てたメモリオブジェクトを解放する */ GDI-ペン: BOOL DeletePen(HPEN hPen); /* ペンの破棄 */ HPEN SelectPen(HDC hDC, HPEN hPen); /* ペンをDCに選択 */ HPEN GetStockPen(int fnPen); /* ストックペンの取得 */ GDI-ブラシ: BOOL DeleteBrush(HBRUSH hBrush); /* ブラシの破棄 */ HBRUSH SelectBrush(HDC hDC, HBRUSH hBrush); /* ブラシをDCに選択 */ HBRUSH GetStockBrush(int fnBrush); /* ストックブラシの取得 */ GDI-リージョン: BOOL DeleteRgn(HRGN hRgn); /* リージョンの破棄 */ int CopyRgn(HRGN hDestRgn, HRGN hSrcRgn); /* リージョンのコピー */ int IntersectRgn(HRGN hResultRgn, HRGN hRgnA, HRGN hRgnB); /* リージョンのAND */ int SubtractRgn(HRGN hResultRgn, HRGN hRgnA, HRGN hRgnB); /* リージョンのDIFF */ int UnionRgn(HRGN hResultRgn, HRGN hRgnA, HRGN hRgnB); /* リージョンのOR */ int XorRgn(HRGN hResultRgn, HRGN hRgnA, HRGN hRgnB); /* リージョンのXOR */ GDI-パレット: BOOL DeletePalette(HPALETTE hPal); /* パレットの破棄 */ GDI-フォント: BOOL DeleteFont(HFONT hFont); /* フォントの破棄 */ HFONT SelectFont(HDC hDC, HFONT hFont); /* フォントをDCに選択 */ HFONT GetStockFont(int fnFont); /* ストックフォントの取得 */ GDI-ビットマップ: BOOL DeleteBitmap(HBITMAP hBmp); /* ビットマップの破棄 */ HBITMAP SelectBitmap(HDC hDC, HBITMAP hBmp); /* ビットマップをDCに選択 */ 長方形: BOOL InsetRect(LPRECT lpRect, int dx, int dy); /* 長方形の幅と高さを指定された分縮める */ ウィンドウの情報: HINSTANCE GetWindowInstance(HWND hWnd); /* ウィンドウのインスタンスハンドルを取得。 */ DWORD GetWindowStyle(HWND hWnd); /* ウィンドウスタイルを取得 */ DWORD GetWindowExStyle(HWND hWnd); /* ウィンドウの拡張スタイルを取得 */ ウィンドウ間の関係: HWND GetWindowOwner(HWND hWnd); /* 所有元ウィンドウを取得 */ HWND GetFirstChild(HWND hWnd); /* 最初の子ウィンドウを取得 */ HWND GetFirstSibling(HWND hWnd); /* 一番手前のウィンドウを取得(GW_HWNDFIRST) */ HWND GetLastSibling(HWND hWnd); /* 一番後ろのウィンドウを取得(GW_HWNDLAST) */ HWND GetNextSibling(HWND hWnd); /* 次のウィンドウを取得(GW_HWNDNEXT) */ HWND GetPrevSibling(HWND hWnd); /* 前のウィンドウを取得(GW_HWNDPREV) */ コントロール: int GetWindowID(HWND hWnd); /* コントロールの識別子を取得 */ ウィンドウ一般: void SetWindowRedraw(HWND hWnd, BOOL fRedraw); /* 再描画フラグの設定 */ WNDPROC SubclassWindow(HWND hWnd, WNDPROC lpfn); /* ウィンドウをサブクラス化 */ BOOL IsMinimized(HWND hWnd); /* ウィンドウが最小化されているかどうか判定 */ BOOL IsMaximized(HWND hWnd); /* ウィンドウが最大化されているかどうか判定 */ BOOL IsRestored(HWND hWnd); /* ウィンドウが元の大きさかどうか判定 */ ウィンドウのフォント: void SetWindowFont(HWND hWnd, HFONT hFont, BOOL fRedraw); /* ウィンドウのフォントを設定 */ HFONT GetWindowFont(HWND hWnd); /* ウィンドウのフォントを取得 */ ウィンドウと長方形: int MapWindowRect(HWND hSrcWnd, HWND hDestWnd, LPRECT lpRect); /* 相対座標で表された長方形を他のウィンドウの相対座標に変換 */ マウスボタンの判定: BOOL IsLButtonDown(VOID); /* マウスの左ボタンが押されているかどうか判定 */ BOOL IsRButtonDown(VOID); /* マウスの右ボタンが押されているかどうか判定 */ BOOL IsMButtonDown(VOID); /* マウスの中ボタンが押されているかどうか判定 */ ダイアログ: DLGPROC SubclassDIalog(HWND hDlgWnd, DLGPROC lpfn); /* ダイアログボックスのサブクラス化 */ SetDlgMsgResult(hDlgWnd, UINT msg, LRESULT result); /* msgで指定されたメッセージがダイアログに関係するメッセージの場合に、resultで指定されたメッセージをダイアログプロシージャの処理結果としてSetWindowLongにより設定する */ LRESULT DefDlgProcEx(HWND hDlgWnd, UINT msg, WPARAM wParam, LPARAM lParam, LPBOOL pfRecursion); /* 再入フラグpfRecursionを立て、DefDlgProcを実行する */ VOID CheckDefDlgRecursion(LPBOOL pfRecursion); /* 再入フラグpfRecursionがたっているならば、フラグをクリアした後に偽を返してreturnする */ メッセージクラッカー: メッセージクラッカーは、以下のように使用する。その他のマクロについてはwindowsx.hを参照。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { HANDLE_MSG(hWnd, WM_LBUTTONDOWN, Cls_OnLButtonDown); HANDLE_MSG(hWnd, WM_RBUTTONDOWN, Cls_OnRButtonDown); default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } } void Cls_OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags) { MessageBox(hwnd, "左ボタンが押された", "message", MB_OK); } void Cls_OnRButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags) { MessageBox(hwnd, "右ボタンが押された", "message", MB_OK); } スタティックコントロール: BOOL Static_Enable(HWND hStatic, BOOL fEnable); /* スタティックコントロールの入力可能・不可能の切り替え */ int Static_GetText(HWND hStatic, LPTSTR lpszText, int cchMax); /* スタティックコントロールのテキストを取得 */ int Static_GetTextLength(HWND hStatic); /* スタティックコントロールのテキストの長さを取得 */ BOOL SetWindowText(HWND hStatic, LPCTSTR lpszText); /* スタティックコントロールにテキストを設定 */ HICON Static_SetIcon(HWND hStatic, HICON hIcon); /* スタティックコントロールにアイコンを設定 */ HICON Static_GetIcon(HWND hStatic, HICON hIcon); /* スタティックコントロールからアイコンを取得 */ ボタン: BOOL Button_Enable(HWND hButton, BOOL fEnable); /* ボタンの使用不可・使用可能の切り替え */ int Button_GetText(HWND hButton, LPTSTR lpszText, int cchMax); /* ボタンのテキストを取得 */ int Button_GetTextLength(HWND hButton); /* ボタンのテキストの長さを取得 */ int Button_SetText(HWDN hButton, LPCTSTR lpszText); /* ボタンのテキストを設定 */ int Button_GetCheck(HWND hButton); /* ボタンの選択状態を取得 */ void Button_SetCheck(HWND hButton, int check); /* ボタンの選択状態を設定 */ int Button_GetState(HWND hButton); /* ボタンの状態の取得 */ UINT Button_SetState(HWND hButton, int state); /* ボタンの状態の設定 */ void Button_SetStyle(HWND hButton, DWORD style, BOOL fRedraw); /* ボタンのスタイルを設定 */ エディットコントロール: BOOL Edit_Enable(HWND hEdit, BOOL fEnable); /* エディットコントロールの使用可能・使用不可の切り替え */ int Edit_GetText(HWND hEdit, LPTSTR lpszText, int cchMax); /* エディットコントロールのテキストを取得 */ int Edit_GetTextLength(HWND hEdit); /* エディットコントロールのテキストの長さを取得 */ int Edit_SetText(HWND hEdit, LPCTSTR lpszText); /* エディットコントロールのテキストを設定 */ void Edit_LimitText(HWND hEdit, DWORD cchMax); /* エディットコントロールの入力可能文字数を設定 */ DWORD Edit_GetLineCount(HWND hEdit); /* エディットコントロールの行数を取得 */ int Edit_GetLine(HWND hEdit, int line, LPTSTR lpszText, int cchMax); /* エディットコントロールの指定された行の文字列を取得 */ void Edit_GetRect(HWND hEdit, LPRECT lpRect); /* エディットコントロールの整形長方形を取得 */ void Edit_SetRect(HWND hEdit, LPRECT lpRect); /* エディットコントロールの整形長方形を設定 */ void Edit_SetRectNoPaint(HWND hEdit, LPRECT lpRect); /* 再描画なしでエディットコントロールの整形長方形を設定 */ DWORD Edit_GetSel(HWND hEdit); /* エディットコントロールの選択項目の開始位置及び直後の最初の非選択文字位置を返す(EM_GETSEL) */ void Edit_SetSel(HWND hEdit, int ichStart, int ichEnd); /* エディットコントロールの選択項目の開始位置及び終了位置を設定 */ void Edit_ReplaceSel(HWND hEdit, LPCTSTR lpszReplace); /* エディットコントロール内の選択項目を指定された文字列に置き換える */ BOOL Edit_GetModify(HWND hEdit); /* エディットコントロールの内容が修正されているかどうか判定 */ BOOL Edit_SetModify(HWND hEdit, UINT fModified); /* エディットコントロールの修正フラグを設定 */ BOOL Edit_ScrollCaret(HWND hEdit); /* エディットコントロールをスクロールしてキャレットを表示 */ int Edit_LineFromChar(HWND hEdit, int ich); /* 指定した文字インデックスを含む行の行番号を取得 */ int Edit_LineIndex(HWND hEdit, int line); /* 指定した行の文字インデックスを取得 */ int Edit_LineLength(HWND hEdit, int line); /* 指定した文字インデックスを含む行の長さを取得(line?) */ void Edit_Scroll(HWND hEdit, int cyScrool, int cxScroll); /* エディットコントロールをスクロール */ BOOL Edit_CanUndo(HWND hEdit); /* エディットコントロールがアンドゥできるかどうか判定 */ BOOL Edit_Undo(HWND hEdit); /* エディットコントロールをアンドゥする */ void Edit_EmptyUndoBuffer(HWND hEdit); /* エディットコントロールのアンドゥフラグを初期化 */ void Edit_SetPasswordChar(HWND hEdit, UINT ch); /* パスワード文字を設定 */ void Edit_SetTabStops(HWND hEdit, int cTabs, LPWORD lpTabs); /* 指定したタブストップの配列によりタブステップを設定する */ BOOL Edit_FmtLines(HWND hEdit, BOOL fAddEOL); /* ソフト改行文字を有効にするかどうかを設定 */ HLOCAL Edit_GetHandle(HWND hEdit); /* エディットコントロールのテキスト格納用メモリのハンドルを取得 */ void Edit_SetHandle(HWND hEdit, HLOCAL hloc); /* エディットコントロールのテキスト格納用メモリのハンドルを設定 */ int Edit_GetFirstVisibleLine(HWND hEdit); /* エディットコントロール内に表示されている一番上の行を取得 */ BOOL Edit_SetReadOnly(HWND hEdit, BOOL fReadOnly); /* エディットコントロールの読み取り専用の設定 */ TCHAR Edit_GetPasswordChar(HWND hEdit); /* パスワード文字を取得 */ void Edit_SetWordBreakProc(HWND hEdit, EDITWORDBREAKPROC lpfnWorkBreak); /* ワードラップ関数の設定 */ EDITWORDBREAKPROC Edit_GetWordBreakProc(HWND hEdit); /* ワードラップ関数の取得 */ スクロールバー: BOOL ScrollBar_Enable(HWND hScroll, UINT SbFlags); /* スクロールバーの矢印の使用可能・不可能の設定 */ BOOL ScrollBar_Show(HWND hScroll, BOOL fShow); /* スクロールバーの表示状態を設定 */ int ScrollBar_SetPos(HWND hScroll, int nPos, BOOL fRedraw); /* スクロールバーのつまみの位置を設定 */ int ScrollBar_GetPos(HWND hScroll); /* スクロールバーのつまみの位置を取得 */ BOOL ScrollBar_SetRange(HWND hScroll, int posMin, int posMax, BOOL fRedraw); /* スクロールバーの最大位置・最小位置を設定 */ BOOL ScrollBar_GetRange(HWND hScroll, LPINT lpposMin, LPINT lpposMax); /* スクロールバーの最大位置・最小位置を取得 */ リストボックス: BOOL ListBox_Enable(HWND hList, BOOL fEnable); /* リストボックスへの入力を可能・不可能にする */ int ListBox_GetCount(HWND hList); /* リストボックス内の項目数を取得 */ BOOL ListBox_ResertContent(HWND hList); /* リストボックスから項目を全て削除 */ int ListBox_AddString(HWND hList, LPCTSTR lpsz); /* リストボックスの末尾に項目を追加 */ int ListBox_InsertString(HWND hList, int index, LPCTSTR lpsz); /* リストボックスの指定した位置に項目を追加 */ ListBox_AddItemData ListBox_InsertItemData int ListBox_DeleteString(HWND hList, int index); /* リストボックスから項目を削除 */ int ListBox_GetTextLen(HWND hList, int index); /* リストボックス内の項目の長さを取得 */ int ListBox_GetText(HWND hWnd, int index, LPCTSTR lpszBuffer); /* リストボックス内の項目を取得(LPCTSTR?) */ LRESULT ListBox_GetItemData(HWND hList, int index); /* リストボックスの項目に関連付けられた32bitデータを取得 */ int ListBox_SetItemData(HWND hList, int index, LPARAM dwData); /* リストボックスの項目に関連付けられた32bitデータを設定 */ int ListBox_FindString(HWND hList, int indexStart, LPCTSTR lpszFind); /* プリフィックスによる項目の検索 */ ListBox_FindItemData int ListBox_SetSel(HWND hList, BOOL fSelect, UINT index); /* 複数選択リストボックスの項目を選択 */ int ListBox_SelItemRange(HWND hList, BOOL fSelect, WORD first, WORD last); /* 複数選択リストボックスの連続する項目を選択 */ int ListBox_GeCurSel(HWND hList); /* 単一選択リストボックスで選択されている項目を取得 */ int ListBox_SetCurSel(HWND hList, int index); /* 単一選択リストボックス内の項目を選択 */ int ListBox_SelectString(HWND hList, int indexStart, LPCTSTR lpszFind); /* リストボックス内の項目の検索と選択 */ ListBox_SelectItemData int ListBox_GetSel(HWND hList, int index); /* 項目の選択状態を取得 */ int ListBox_GetSelCount(HWND hList); /* 複数選択リストボックスの選択されている項目の数を取得 */ int ListBox_GeTopIndex(HWND hList); /* リストボックス内に表示されている先頭の項目を取得 */ int ListBox_GetSelItems(HWND hList, int cItems, int *lpItems); /* 複数選択リストボックス内で選択されている項目を取得 */ int ListBox_SetTopIndex(HWND hList, int indexTop); /* リストボックス内で表示されている先頭の項目を設定 */ void ListBox_SetColumnWidth(HWND hList, int cxColumn); /* 列幅を設定する */ int ListBox_GetHorizontalExtent(HWND hList); /* スクロール可能な幅を取得 */ void ListBox_SetHorizontalExtent(HWND hList, int cxExtent); /* スクロール可能な幅を設定 */ BOOL ListBox_SetTabStops(HWND hList, int cTabs, int *lpTabs); /* リストボックス内にタブストップを設定する */ int ListBox_GetItemRect(HWND hList, int index, LPRECT lpRect); /* 項目の長方形を取得 */ int ListBox_SetCaretIndex(HWND hList, int index); /* 複数選択リストボックス内のフォーカスを持つ項目を設定 */ int ListBox_GetCaretIndex(HWND hList); /* 複数選択リストボックスのフォーカスを持つ項目を取得 */ int ListBox_FindStringExact(HWND hList, int indexStart, LPCTSTR lpszFind); /* 項目の検索 */ int ListBox_SetItemHeight(HWND hList, int index, WORD cy); /* 項目の高さを設定 */ int ListBox_GetItemHeight(HWND hList, int index); /* 項目の高さを取得 */ int ListBox_Dir(HWND hList, UINT attrs, LPCTSTR lpszFileSpec); /* リストボックスにファイル名のリストを追加 */ コンボボックス: BOOL EnableWindow(HWND hCombo, BOOL fEnable); /* コンボボックスへの入力を可能・不可能にする */ int ComboBox_GetText(HWND hCombo, LPTSTR lpsz, int cch); /* コンボボックスのテキストコントロール部分の文字列を取得 */ int ComboBox_GetTextLength(HWND hCombo); /* コンボボックスのテキストコントロール部分の文字列長を取得 */ BOOL ComboBox_SetText(HWND hCombo, LPCTSTR lpsz); /* コンボボックスのテキストコントロール部分の文字列の設定 */ int ComboBox_LimitText(HWND hCombo, int cchLimit); /* コンボボックスのテキストコントロール部分の文字列長の制限を設定 */ DWORD ComboBox_GetEditSel(HWND hCombo); /* コンボボックスのエディットコントロール部分の選択範囲を取得 */ int ComboBox_SetEditSel(HWND hCombo, WORD ichStart, WORD ichEnd); /* コンボボックスのエディットコントロール部分の選択範囲を設定 */ int ComboBox_GetCount(HWND hCombo); /* コンボボックスの項目数を取得 */ int ComboBox_ResetContent(HWND hCombo); /* コンボボックスから項目を全て削除 */ int ComboBox_AddString(HWND hCombo, LPCTSTR lpsz); /* コンボボックスに項目を追加 */ int ComboBox_InsertString(HWND hCombo, int index, LPCTSTR lpsz); /* コンボボックスの指定された位置に項目を追加 */ ComboBox_AddItemData ComboBox_InsertItemData int ComboBox_DeleteString(HWND hCombo, int index); /* コンボボックスの項目を削除 */ int ComboBox_GetLBText(HWND hCombo, int index, LPCTSTR lpszBuffer); /* コンボボックスから項目を取得 */ LRESULT ComboBox_GetItemData(HWND hCombo, int index); /* コンボボックスのアイテムデータを取得 */ int ComboBox_SetItemData(HWND hCombo,int index, DWORD data); /* コンボボックスのアイテムデータを設定 */ int ComboBox_FindString(HWND hCombo, int indexStart, LPCTSTR lpszFind); /* コンボボックスから項目をプリフィックスで検索 */ ComboBox_FindItemData int ComboBox_GetCurSel(HWND hCombo); /* コンボボックスの選択されている項目を取得 */ int ComboBox_SetCurSel(HWND hCombo, int index); /* コンボボックスの選択されている項目を設定 */ int ComboBox_SelectString(HWND hCombo, int indexStart, LPCTSTR lpszSelect); /* コンボボックスから項目をプリフィックスで検索し、エディットコントロールに反映 */ ComboBox_SelectItemData int ComboBox_Dir(HWND hCombo, UINT attrs, LPCTSTR lpszFileSpec); /* コンボボックスにファイル名のリストを追加 */ BOOL ComboBox_ShowDropdown(HWND hCombo, BOOL fShow); /* ドロップダウンリストボックスの表示・非表示の切り替え */ int ComboBox_FindStringExact(HWND hCombo, int indexStart, LPCTSTR lpszFind); /* コンボボックスから項目を検索 */ BOOL ComboBox_GetDroppedState(HWND hCombo); /* ドロップダウンリストボックスがドロップダウンされているかどうかを取得 */ void ComboBox_GetDroppedControlRect(HWND hCombo, LPRECT lpRect); /* ドロップダウンリストボックスのスクリーン座標を取得 */ int ComboBox_GetItemHeight(HWND hCombo, int index); /* コンボボックスの項目の高さを取得 */ int ComboBox_SetItemHeight(HWND hCombo, int index, int cyItem); /* コンボボックスの項目の高さを設定 */ UINT ComboBox_GetExtentedUI(HWND hCombo); /* コンボボックスのユーザインターフェースの種別を取得 */ int ComboBox_SetExtendedUI(HWND hCombo, UINT flags); /* コンボボックスのユーザインターフェースの種別を設定 */ wParamとlParamから値を抽出: メッセージの種別によってwParamとlParamはさまざまに解釈されるが、これを処理 するためのマクロ。 例えば、WM_CHARTOITEM_CHARメッセージが送られてきた際にキャレットの現在位置を wParamとlParamから取得するには、GET_WM_CHARTOITEM_POS(wParam, lParam)とする。 その他のマクロについてはwindowsx.hを参照。