SetWindowLong関数
LONG SetWindowLong(
HWND hWnd,
int nIndex,
LONG dwNewLong
);
指定されたウィンドウの属性を変更します。
拡張ウィンドウメモリのデータも書き換えることができます。
hWnd | ウィンドウのハンドルを指定します。 | ||||||||||
nIndex | ウィンドウに関するデータのうち、どのデータを書き換えるのかを指定します。
| ||||||||||
dwNewLong | 新しく設定する値を32ビット値で指定します。 |
http://gardener.hustle.ne.jp/programming/
C言語関連の要点まとめ(更新停止中)
hWnd | ウィンドウのハンドルを指定します。 | ||||||||||
nIndex | ウィンドウに関するデータのうち、どのデータを書き換えるのかを指定します。
| ||||||||||
dwNewLong | 新しく設定する値を32ビット値で指定します。 |
hWnd | ウィンドウのハンドルを指定します。 | ||||||||||||||||
hWndInsertAfter | hWndパラメータで指定したウィンドウに先行するウィンドウのハンドルを指定します。
| ||||||||||||||||
X | ウィンドウの左上隅の新しいx座標を指定します。 | ||||||||||||||||
Y | ウィンドウの左上隅の新しいy座標を指定します。 | ||||||||||||||||
cx | ウィンドウの新しい幅をピクセル単位で指定します。 | ||||||||||||||||
cy | ウィンドウの新しい高さをピクセル単位で指定します。 | ||||||||||||||||
uFlags | ウィンドウのサイズおよび位置の変更に関するフラグを指定します。
|
#include <windows.h>
#define CLASSNAME "MyWindowClass"
// グローバル変数:
HINSTANCE hInst;
// このコード モジュールに含まれる関数の宣言を転送します:
ATOM MyRegisterClass( HINSTANCE );
BOOL InitInstance( HINSTANCE, int );
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
//----------------------------------------------------------------
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
MSG msg;
MyRegisterClass( hInstance );
if ( !InitInstance( hInstance, nCmdShow ) ) return FALSE;
// メイン メッセージ ループ:
while ( GetMessage( &msg, NULL, 0, 0 ) ) {
TranslateMessage( &msg );
DispatchMessage( &msg );
}
return ( int )msg.wParam;
}
//----------------------------------------------------------------
ATOM MyRegisterClass( HINSTANCE hInstance ) {(省略)}
//----------------------------------------------------------------
BOOL InitInstance( HINSTANCE hInstance, int nCmdShow )
{
HWND hWnd, hWndChild, hWndOwned;
hInst = hInstance;
// メインウィンドウ
hWnd = CreateWindow( CLASSNAME, "Main Window",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
300, 200, NULL, NULL, hInstance, NULL );
if ( !hWnd ) return FALSE;
// 子ウィンドウ
hWndChild = CreateWindow( CLASSNAME, "Child Window",
WS_CHILD | WS_CAPTION | WS_VISIBLE,
0, 0, 150, 100, hWnd, NULL, hInstance, NULL );
if ( !hWndChild ) return FALSE;
// 被所有ウィンドウ
hWndOwned = CreateWindow( CLASSNAME, "Owned Window",
WS_POPUP | WS_CAPTION | WS_VISIBLE,
0, 0, 150, 100, hWnd, NULL, hInstance, NULL );
if ( !hWndOwned ) return FALSE;
// ウィンドウを表示する
ShowWindow( hWnd, nCmdShow );
UpdateWindow( hWnd );
return TRUE;
}
//----------------------------------------------------------------
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) {(省略)}
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
PAINTSTRUCT ps;
HDC hdc;
char str[256];
static HWND hwButton0, hwButton1;
static int iMode =0;
switch (message) {
case WM_CREATE:
hwButton0 = CreateWindow( "Button", "Button0", WS_CHILD | WS_VISIBLE, 16, 8, 80, 24, hWnd, ( HMENU )0, hInst, NULL);
hwButton1 = CreateWindow( "Button", "Button1", WS_CHILD | WS_VISIBLE, 108, 8, 80, 24, hWnd, ( HMENU )1, hInst, NULL);
break;
case WM_COMMAND:
switch ( LOWORD( wParam ) ) { // クリックされたボタン判別
case 0: // hwButton0
iMode = 0;
InvalidateRect( hWnd, NULL, TRUE );
break;
case 1: // hwButton1
iMode = 1;
InvalidateRect( hWnd, NULL, TRUE );
break;
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 描画コードをここに追加してください...
wsprintf( str, "押されたボタンは%d", iMode );
TextOut( hdc, 16, 40, str, ( int )strlen( str ) );
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc( hWnd, message, wParam, lParam );
}
return 0;
}
WS_EX_ACCEPTFILES | このスタイルで作成されたウィンドウでは、ファイルをドラッグ アンド ドロップできます。 |
WS_EX_APPWINDOW | 一番上にあるウィンドウを表示するときに、強制的にタスクバーに含みます。 |
WS_EX_CLIENTEDGE | ウィンドウを 3 次元で表示することを指定します。つまり、ウィンドウには、くぼんだ境界線が付きます。 |
WS_EX_CONTEXTHELP | ウィンドウのタイトル バーに疑問符 (?) を追加します。ユーザーが疑問符 (?) をクリックすると、カーソルがポインタの付いた疑問符 (?) に変わります。続いてユーザーが子ウィンドウをクリックすると、その子ウィンドウが WM_HELP メッセージを受け取ります。 |
WS_EX_CONTROLPARENT | ユーザーが、Tab キーを使ってウィンドウ内の子ウィンドウ間を移動できるようにします。 |
WS_EX_DLGMODALFRAME | 二重の境界を持つウィンドウを指定します。パラメータ dwStyle に WS_CAPTION スタイル フラグを指定することにより、タイトル バーを追加することもできます。 |
WS_EX_LEFT | ウィンドウに汎用左揃えプロパティを指定します。これは、既定の設定です。 |
WS_EX_LEFTSCROLLBAR | クライアント領域の左に垂直スクロール バーを配置します。 |
WS_EX_LTRREADING | 左から右への読み取り順序でウィンドウのテキストを表示します。これは、既定の設定です。 |
WS_EX_MDICHILD | MDI 子ウィンドウを作成します。 |
WS_EX_NOPARENTNOTIFY | このスタイルを指定されている子ウィンドウは、作成または破棄されるときに親ウィンドウに WM_PARENTNOTIFY メッセージを送りません。 |
WS_EX_OVERLAPPEDWINDOW | WS_EX_CLIENTEDGE スタイルと WS_EX_WINDOWEDGE スタイルを組み合わせます。 |
WS_EX_PALETTEWINDOW | WS_EX_WINDOWEDGE スタイルと WS_EX_TOPMOST スタイルを組み合わせます。 |
WS_EX_RIGHT | ウィンドウに汎用右揃えプロパティを指定します。このスタイルは、ウィンドウ クラスに依存します。 |
WS_EX_RIGHTSCROLLBAR | クライアント領域の右に垂直スクロール バー (存在する場合) を配置します。これは、既定の設定です。 |
WS_EX_RTLREADING | 右から左への読み取り順序でウィンドウのテキストを表示します。 |
WS_EX_STATICEDGE | 3 次元の境界線スタイルを持つウィンドウを作成します。このウィンドウは、ユーザーの入力を受け付けない項目用に使用します。 |
WS_EX_TOOLWINDOW | ツール ウィンドウを作成します。このウィンドウは、フローティング ツール バーとして使用します。ツール ウィンドウのタイトル バーは通常よりも短く、ウィンドウのタイトルはより小さいフォントで描画されます。タスク バーや、ユーザーが Alt キーを押しながら Tab キーを押して表示したウィンドウには、ツール ウィンドウは表示されません。 |
WS_EX_TOPMOST | このスタイルで作成されたウィンドウは、すべてのウィンドウの上に配置され、アクティブでなくなった場合でも、引き続きほかのウィンドウの上に表示されたままになります。アプリケーションは、SetWindowPos メンバ関数を使って、この属性を追加および削除できます。 |
WS_EX_TRANSPARENT | このスタイルで作成されたウィンドウは透明になります。つまり、このウィンドウの下にあるウィンドウが見えなくなることはありません。このスタイルで作成されたウィンドウは、そのウィンドウの下にある兄弟ウィンドウがすべて更新された後にだけ、WM_PAINT メッセージを受け取ります。 |
WS_EX_WINDOWEDGE | 縁の浮き出した境界線を持つウィンドウを指定します。 |
lpClassName | 登録済みのウィンドウクラス名 |
lpWindowName | ウィンドウの名前 |
dwStyle | ウィンドウの種類や状態を表すビットフラグ |
x | ウィンドウの初期位置 |
y | ウィンドウの初期位置 |
nWidth | ウィンドウの幅 |
nHeight | ウィンドウの高さ |
hWndParent | 親ウィンドウのハンドル |
hMenu | メニューのハンドル |
hInstance | WinMain()関数から取得したインスタンスハンドル |
lpParam | 拡張用のパラメータ |
#define CLASSNAME "Project_Name"
#define WINDOWNAME "TEST"
(中略)
HWND hWnd;
hWnd = CreateWindow( CLASSNAME, WINDOWNAME, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL );
if ( !hWnd ) {
return FALSE;
}
WS_CAPTION | タイトルバーを持つウィンドウを作成します。このスタイルを指定する場合は、WS_BORDERスタイルも指定する必要もあります。WS_DLGFRAMEスタイルと一緒に使うことはできません。 |
WS_BORDER | 境界線を持つウィンドウを作成します。細い(サイズ変更可能な)ウィンドウ枠です。 |
WS_DLGFRAME | 二重の境界線を持ち、タイトルは持たないウィンドウを作成します。ダイアログボックスで使用するウィンドウ枠です。 |
WS_THICKFRAME WS_SIZEBOX | サイズ変更境界を持つウィンドウを作成します。太い(サイズ変更可能な)ウィンドウ枠です。 |
WS_HSCROLL | 水平スクロールバーを持つウィンドウを作成します。 |
WS_VSCROLL | 垂直スクロールバーを持つウィンドウを作成します。 |
WS_SYSMENU | タイトルバーにコントロールメニューボックスを持つウィンドウを作成します。タイトルバーを持つウィンドウだけに指定します。WS_CAPTIONスタイルも指定する必要があります。 |
WS_MAXIMIZEBOX | 最大化ボタンを持つウィンドウを作成します。WS_SYSMENUと同時に指定する。 |
WS_MINIMIZEBOX | 最小化ボタンを持つウィンドウを作成します。WS_SYSMENUと同時に指定する。 |
WS_OVERLAPPED WS_TILED | オーバラップウィンドウを作成します。オーバラップウィンドウには、タイトルバーと境界線があります。 |
WS_POPUP | ポップアップウィンドウを作成します。WS_CHILDスタイルと一緒に使うことはできません。 |
WS_CHILD | 子ウィンドウを作成します。WS_POPUPスタイルと一緒に使うことはできません。 |
WS_OVERLAPPEDWINDOW WS_TILEDWINDOW | WS_OVERLAPPED、WS_CAPTION、WS_SYSMENU、WS_THICKFRAME、WS_MINIMIZEBOX、WS_MAXIMIZEBOXスタイルを持つオーバラップウィンドウを作成します。 |
WS_POPUPWINDOW | WS_BORDER、WS_POPUP、およびWS_SYSMENUスタイルを持つポップアップウィンドウを作成します。コントロールメニューを表示するには、WS_CAPTIONスタイルとWS_POPUPWINDOWスタイルを組み合わせて指定する必要があります。 |
WS_CHILDWINDOW | WS_CHILDと同じ |
WS_MINIMIZE WS_ICONIC | 初期状態で最小化されたウィンドウを作成します。必ずWS_OVERLAPPEDスタイルと一緒に使います。 |
WS_MAXIMIZE | 最大化されたウィンドウを作成します。 |
WS_VISIBLE | 初期状態で表示されるウィンドウを作成します。 |
WS_DISABLED | 初期状態で無効になっているウィンドウを作成します。 |
WS_TABSTOP | ダイアログボックスでTABキーを押した時に、コントロールが入力フォーカスを取得できるようにする。 |
WS_GROUP | ダイアログボックスでコントロールをグループ化する際に指定する。 |
WS_CLIPCHILDREN | クライアント領域内の子ウィンドウのある部分を描画対象から除外する。 |
WS_CLIPSIBLINGS | 同じ親ウィンドウの子ウィンドウ同士で重なっている部分を描画対象から除外する。 |
![]() | WS_OVERLAPPEDWINDOW サイズ変更可 |
![]() | WS_POPUPWINDOW | WS_CAPTION サイズ変更不可 |
![]() | WS_POPUP | WS_BORDER | WS_CAPTION サイズ変更不可 |
![]() | WS_OVERLAPPEDWINDOW ^ WS_THICKFRAME ^ WS_MAXIMIZEBOX サイズ変更不可 |
lpRect | クライアント領域の座標が入ったRECT構造体へのポインタ。この構造体に指定したクライアント領域に対応するウィンドウの座標が格納される。 |
dwStyle | ウィンドウスタイルを指定します。 |
bMenu | ウィンドウがメニューを持つかどうかを指定します。メニューを持つ時はTRUEを、持たない時はFALSEを指定します。 |
#define SIZE_SCREEN_W 640
#define SIZE_SCREEN_H 480
RECT rcAdjWndRect; // ウィンドウサイズ修正用
SetRect( &rcAdjWndRect, 0, 0, SIZE_SCREEN_W, SIZE_SCREEN_H );
AdjustWindowRect( &rcAdjWndRect, WS_OVERLAPPEDWINDOW, FALSE );
hWnd | 表示するメッセージボックスが持つ親ウィンドウを第1引数に指定します。親ウィンドウを持たない場合はNULLを渡します。 |
lpszText | NULLで終わる文字列へのポインタを渡します。 |
lpszCaption | NULLで終わる文字列へのポインタ。lpszCaptionがNULLの場合は、既定のキャプションである"エラー"が使われます。 |
nType | メッセージ ボックスの内容と動作を指定します。 |
![]() | MB_ICONHAND、MB_ICONSTOP、MB_ICONERROR |
![]() | MB_ICONQUESTION |
![]() | MB_ICONEXCLAMATION、MB_ICONWARNING |
![]() | MB_ICONASTERISK、MB_ICONINFORMATION |
MB_ABORTRETRYIGNORE | [中止]、[再試行]、[無視] |
MB_OK | [OK](デフォルト) |
MB_OKCANCEL | [OK]、[キャンセル] |
MB_RETRYCANCEL | [再試行]、[キャンセル] |
MB_YESNO | [はい]、[いいえ] |
MB_YESNOCANCEL | [はい]、[いいえ]、[キャンセル] |
IDABORT | [中止]が押された |
IDCANCEL | [キャンセル]が押された |
IDIGNORE | [無視]が押された |
IDNO | [いいえ]が押された |
IDOK | [OK]が押された |
IDRETRY | [再試行]が押された |
IDYES | [はい]が押された |
style | ウィンドウの基本的な設定を行うビットフラグを指定する。 |
lpfnWndProc | ウィンドウプロシージャ。拡張の必要が無ければDefWindowProc()で良い。 |
cbClsExtra | 使用しない。0にする。 |
cbWndExtra | 使用しない。0にする。 |
hInstance | このウィンドウクラスを登録するアプリケーションのインスタンスハンドルを指定する。WinMain()関数が引数で受け取ったインスタンスハンドルを設定する。 |
hIcon | ウィンドウのアイコン。NULLを指定した場合は標準のアイコン。 |
hCursor | マウスがウィンドウ上にあるときのカーソル。NULLを指定した場合は、現在のカーソルがそのまま表示される。 |
hbrBackground | 背景色。色の値は標準のシステムカラーの1つでなければならない。(選ばれた値には1を加えなければならない。) |
lpszMenuName | ウィンドウのデフォルトメニューとなるメニューの名前を指定する。 |
LpszClassName | 一意のクラス名。 |
#define CLASSNAME "Project_Name"
WNDCLASS wc;
wc.style = 0;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.style = CS_BYTEALIGNCLIENT | CS_BYTEALIGNWINDOW;
wc.lpfnWndProc = WndProc;
wc.lpfnWndProc = DefWindowProc; // 拡張の必要が無ければデフォルトのウィンドウプロシージャで良い
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );
wc.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE( IDI_PROJECTNAME ) );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = ( HBRUSH )( COLOR_WINDOW + 1 ); // COLOR_で始まるのはシステムカラーを示す定数
wc.lpszMenuName = 0;
wc.lpszMenuName = MAKEINTRESOURCE( IDC_PROJECTNAME );
wc.lpszClassName = CLASSNAME; // クラス名
IDI_APPLICATION | Default application icon. |
IDI_ASTERISK | Same as IDI_INFORMATION. |
IDI_ERROR | Hand-shaped icon. |
IDI_EXCLAMATION | Same as IDI_WARNING. |
IDI_HAND | Same as IDI_ERROR. |
IDI_INFORMATION | Asterisk icon. |
IDI_QUESTION | Question mark icon. |
IDI_WARNING | Exclamation point icon. |
IDI_WINLOGO | Windows logo icon. Windows XP: Default application icon. |
IDC_APPSTARTING | Standard arrow and small hourglass |
IDC_ARROW | Standard arrow |
IDC_CROSS | Crosshair |
IDC_HAND | Windows 98/Me, Windows 2000/XP: Hand |
IDC_HELP | Arrow and question mark |
IDC_IBEAM | I-beam |
IDC_ICON | Obsolete for applications marked version 4.0 or later. |
IDC_NO | Slashed circle |
IDC_SIZE | Obsolete for applications marked version 4.0 or later. Use IDC_SIZEALL. |
IDC_SIZEALL | Four-pointed arrow pointing north, south, east, and west |
IDC_SIZENESW | Double-pointed arrow pointing northeast and southwest |
IDC_SIZENS | Double-pointed arrow pointing north and south |
IDC_SIZENWSE | Double-pointed arrow pointing northwest and southeast |
IDC_SIZEWE | Double-pointed arrow pointing west and east |
IDC_UPARROW | Vertical arrow |
IDC_WAIT | Hourglass |
hInstance | WinMain関数を実行しているアプリケーションそのものを表すインスタンスハンドルが格納されている。 |
hPrevInstance | 通常はNULLが格納されます。このパラメータは16ビットWindows時代に使われていたもので、Win32 APIでは利用する事はありません。 |
lpCmdLine | コマンドライン引数で渡されたNULLで終わる文字列へのポインタ |
nCmdShow | ウィンドウをどのように表示するべきかを指定した値が格納されています。 |