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 <stdio.h>
typedef struct tagTest {
char c;
int i;
} _TEST;
void Disp( void *t )
{
printf( "%d\n", sizeof( *(_TEST*)t ) );
}
void main()
{
_TEST test;
Disp( &test );
}
#include <stdio.h>
void Disp( void *t )
{
char *pstr = (char*)t;
puts( pstr );
putchar( (int)*pstr );
int *pd = (int*)t;
putchar( *pd );
}
void main()
{
char *str = "abcdefg";
Disp( str );
}
lpsa | 新しいスレッドのセキュリティ属性。 取得したハンドルの子プロセスへの継承を許可するかどうかを決める、SECURITY_ATTRIBUTES構造体へのポインタを指定します。 NULLを指定すると、ハンドルは継承されません。 ※特別な意図が無い限りNULLでいいでしょう。 |
dwStackSize | 新しいスレッドのスタックサイズ。 新しいスレッドが持つスタックのサイズを、バイト単位で指定します。 利用可能なメモリのサイズよりも大きなサイズを指定すると、CreateThread関数は失敗します。 0を指定すると、デフォルトのサイズになります。 ※Windowsは必要に応じてスタックサイズを拡張するため、デフォルトサイズを表す0を指定します。 |
pfnThreadProc | 新しいスレッドのスレッドプロシージャ。 新しいスレッドの開始アドレスを指定します。 通常、WINAPI呼び出し規約で定義された関数のアドレスを指定します。 この関数の書式を次に示します。 DWORD WINAPI ThreadFunc( LPVOID ); |
pvParam | スレッドプロシージャに渡されるパラメータ。 通常はポインタとして使います。 この引数を利用して何らかのデータを渡せば、スレッドごとに異なる処理をさせることができます。 受け渡すデータが多い場合は構造体にデータを格納し、そのポインタを渡します。 |
dwCreationFlags | 作成フラグ(0またはCREATE_SUSPENDED)。 CREATE_SUSPENDEDを指定するとスレッドを中断された状態で作成され、ResumeThread関数を呼び出すまでは動作しません。 ※通常は0を指定して、作成と同時にスレッドを起動します。 |
pdwThreadId | 正常終了したときに、新しく作成されたスレッドのスレッドIDを受け取るDWORD型変数へのアドレス。 |
CreateThread( NULL, 0, ThreadFunc, ( LPVOID )&param, 0, &dwThreadID );
lpMsg | メッセージを取得するMSG構造体へのポインタ |
hWnd | メッセージを取得するウィンドウへのハンドル |
wMsgFilterMin | 取得するメッセージの最小値。両方0にするとフィルタリングしない。 |
wMsgFilterMax | 取得するメッセージの最大値。両方0にするとフィルタリングしない。 |
wRemoveMsg | PM_REMOVE メッセージをキューから削除する PM_NOREMOVE メッセージをキューから削除しない。 |
while (1) {
if ( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) {
// メッセージがある場合はそれを処理する
if ( msg.message == WM_QUIT ) break;
DispatchMessage( &msg );
} else {
// アイドル時の処理を行う
}
}
#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 サイズ変更不可 |