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 | ウィンドウのサイズおよび位置の変更に関するフラグを指定します。
|
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 サイズ変更不可 |
lpPoint | カーソル位置をスクリーン座標で受け取るPOINT構造体を指すポインタ |
hWnd | ウィンドウのハンドルを指定します。このウィンドウのクライアント座標が変換に利用されます。 |
lpPoint | 変換されるスクリーン座標が入ったPOINT構造体へのポインタを指定します。関数が成功すると、この構造体にクライアント座標が格納されます。 |
POINT point;
GetCursorPos( &point );
ScreenToClient( hWnd, &point );
static MCI_ANIM_OPEN_PARMS maop;
static MCI_PLAY_PARMS mpp;
char strErr[256];
case WM_CREATE:
maop.dwCallback = ( DWORD )hWnd;
maop.lpstrElementName = "test.mpg";
maop.dwStyle = WS_CHILD | WS_VISIBLE;
maop.hWndParent = hWnd;
iErr = mciSendCommand( 0, MCI_OPEN,
MCI_OPEN_ELEMENT | MCI_ANIM_OPEN_PARENT | MCI_ANIM_OPEN_WS,
( DWORD )&maop );
if ( iErr ) {
mciGetErrorString( iErr, strErr, sizeof( strErr ) );
MessageBox( hWnd, strErr, NULL, MB_OK | MB_ICONERROR );
return -1;
}
mpp.dwCallback = ( DWORD )hWnd;
break;
case WM_LBUTTONDOWN:
mciSendCommand( maop.wDeviceID, MCI_PLAY, 0, ( DWORD )&mpp );
break;
case WM_DESTROY:
mciSendCommand( maop.wDeviceID, MCI_CLOSE, 0, 0 );
PostQuitMessage(0);
break;
fdwError | Error code returned by the mciSendCommand or mciSendString function. |
lpszErrorText | Pointer to a buffer that receives a null-terminated string describing the specified error. |
cchErrorText | Length of the buffer, in characters, pointed to by the lpszErrorText parameter. |
IDDevice | コマンドを送信するMCIデバイスの識別子を指定します。アプリケーションは、最初にメディアデバイスを開いてこの識別子を取得する必要があります。 |
uMsg | MCIデバイスに送信するコマンドを表す定数を指定します。 |
fdwCommand | コマンドの追加情報となるフラグ |
dwParam | コマンドの情報を格納した構造体へのポインタ |
static MCI_OPEN_PARMS mop;
(略)
case WM_CREATE:
mop.dwCallback = ( DWORD )hWnd;
mop.lpstrDeviceType = ( LPCSTR )MCI_DEVTYPE_WAVEFORM_AUDIO;
mop.lpstrElementName = "test.wav";
iErr = mciSendCommand( 0, MCI_OPEN,
MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT,
( DWORD )&mop );
if ( iErr ) {
mciGetErrorString( iErr, strErr, sizeof( strErr ) );
MessageBox( hWnd, strErr, NULL, MB_OK | MB_ICONERROR );
return -1;
}
break;
case WM_LBUTTONDOWN:
mciSendCommand( mop.wDeviceID, MCI_PLAY, 0, 0 );
break;
case WM_RBUTTONDOWN:
PlaySound( NULL, NULL, SND_PURGE );
mciSendCommand( mop.wDeviceID, MCI_STOP, 0, 0 );
mciSendCommand( mop.wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0 );
break;
case WM_DESTROY:
mciSendCommand( mop.wDeviceID, MCI_CLOSE, 0, 0 );
PostQuitMessage(0);
break;
static MCI_OPEN_PARMS mop;
static MCI_PLAY_PARMS mpp;
(略)
case WM_CREATE:
(デバイスのオープンの記述。上記参照)
mpp.dwCallback = ( DWORD )hWnd;
mpp.dwFrom = 0; // 演奏開始位置の設定、0ならば曲の先頭からになる
case WM_LBUTTONDOWN:
mciSendCommand( mop.wDeviceID, MCI_PLAY, MCI_FROM | MCI_NOTIFY, ( DWORD )&mpp );
break;
case WM_RBUTTONDOWN:
mciSendCommand( mop.wDeviceID, MCI_STOP, 0, 0 );
//mciSendCommand( mop.wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, 0 );
break;
case MM_MCINOTIFY:
if ( wParam == MCI_NOTIFY_SUCCESSFUL )
mciSendCommand( mop.wDeviceID, MCI_PLAY, MCI_FROM | MCI_NOTIFY, ( DWORD )&mpp );
break;
(略)
dwCallback | The low-order word specifies a window handle used for the MCI_NOTIFY flag. |
dwFrom | Position to play from. |
dwTo | Position to play to. |
wDeviceID | 開いたMCIデバイスの識別子が格納されます。開いたデバイスにMCIコマンドを送信するには、このデバイス識別子を利用します。 |
lpstrDeviceType | デバイスのタイプ名を保存した文字列へのポインタ、または定数を指定します。 |
lpstrElementName | 開くMCIデバイスのコンテンツを参照するパスを指定します。 |
lpstrAlias | 開くデバイスに割り当てる別名を指定します。(任意) |
MCI_ALL_DEVICE_ID | Any device |
MCI_DEVTYPE_ANIMATION | Animation-playback device |
MCI_DEVTYPE_CD_AUDIO | CD audio device |
MCI_DEVTYPE_DAT | Digital-audio tape device |
MCI_DEVTYPE_DIGITAL_VIDEO | Digital-video playback device |
MCI_DEVTYPE_OTHER | Undefined device |
MCI_DEVTYPE_OVERLAY | Video-overlay device |
MCI_DEVTYPE_SCANNER | Scanner device |
MCI_DEVTYPE_SEQUENCER | MIDI sequencer device |
MCI_DEVTYPE_VCR | Video-cassette recorder |
MCI_DEVTYPE_VIDEODISC | Videodisc player |
MCI_DEVTYPE_WAVEFORM_AUDIO | Waveform-audio device |
pszSound | 再生するサウンドをNULLで終わる文字列で指定します。ただしfdwSoundパラメータでSND_MEMORYを指定した時は、メモリ内に読み込まれたサウンドイメージへのポインタを指定します。NULLを指定すると、現在再生中のWAVEフォームサウンドが停止します。 |
hmod | fdwSoundパラメータでSND_RESOURCEを指定した場合は、ロードするリソースが入った実行可能ファイルのインスタンスハンドルを指定します。そうでない場合は、NULLを指定します。 |
fdwSound | 再生フラグヲ指定します。 |
SND_ASYNC | サウンドを非同期的に再生します。PlaySound関数は即座に制御を返します。非同期的に再生されているサウンドを止めるには、pszSoundパラメータにNULLを指定してPlaySound関数を呼び出します。 |
SND_FILENAME | pszSoundパラメータは、ファイル名です。 |
SND_LOOP | サウンドを繰り返し再生します。SND_ASYNCと同時に指定します。サウンドの再生を止めるにはpszSoundパラメータにNULLを指定してPlaySound関数を呼び出します。 |
SND_MEMORY | pszSoundパラメータは、メモリ内に読み込まれたサウンドイメージへのポインタです。 |
SND_NODEFAULT | 指定されたサウンドが見つからなかった場合、PlaySound関数はデフォルトのサウンド(一般の警告音)を再生することなく無音で制御を返します。 |
SND_NOSTOP | 既にほかのサウンドが再生されていた場合、指定されたサウンドを再生することなく即座に制御を返します。 |
SND_NOWAIT | ドライバがビジー状態であれば、サウンドを再生することなく即座に制御を返します。 |
SND_PURGE | サウンドの再生を停止します。pszSoundパラメータがNULL以外のときは、指定したサウンドの全てのインスタンスが停止します。pszSoundパラメータがNULLの時は、呼び出し側タスクのすべてのサウンドが停止します。SND_RESOURCE指定時は、インスタンスハンドルも指定します。 |
SND_RESOURCE | pszSoundパラメータはリソースIDです。hmodパラメータには、リソースが入った実行可能ファイルのインスタンスハンドルを指定します。 |
SND_SYNC | サウンドを同期的に再生します。PlaySound関数は、サウンドの再生が完了した後に制御を返します。 |
case WM_LBUTTONDOWN:
PlaySound( "test.wav", NULL, SND_ASYNC | SND_FILENAME );
break;
case WM_RBUTTONDOWN:
PlaySound( NULL, NULL, SND_PURGE );
break;