WM_CREATEはいつ送られてくるのか?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
jyosyua
記事: 65
登録日時: 14年前
住所: 八王子市
連絡を取る:

WM_CREATEはいつ送られてくるのか?

#1

投稿記事 by jyosyua » 12年前

InitInstance(HINSTANCE, int);内でグローバル変数にウィンドウハンドルを退避させています。
それなのにWM_CREATEメッセージでそのグローバル変数を使ってCreateWindowでエディットコントロールを作ると
失敗になり、ウィンドウハンドルとしてNULLが返ります。
つまりその時点でメインウィンドウのCreateWindowは処理を返していないのでしょうか?
スレッド的な感じになっているのでしょうか?
所で、今でも、ハンドルがメモリのアドレスだというページを良く見かけますが、
ttp://www.geocities.jp/ky_webid/win32c/002.html
など、違うのでしょうか?私もポインタで在って欲しいと思います。

コード:

// メモ帳もどき[練習].cpp : アプリケーションのエントリ ポイントを定義します。
//


#include "メモ帳もどき[練習].h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;								// 現在のインターフェイス
TCHAR szTitle[MAX_LOADSTRING]="猫でもわかるメモ帳もどき";// タイトル バーのテキスト
TCHAR *szTitle_org="猫でもわかるメモ帳もどき[%s][%dバイト]";
TCHAR szWindowClass[MAX_LOADSTRING]="memo01";			// メイン ウィンドウ クラス名

static HWND hWndParent;
static HWND hWndEdit;
// このコード モジュールに含まれる関数の宣言を転送します:
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);


int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

 	// TODO: ここにコードを挿入してください。
	MSG msg;
	HACCEL hAccelTable;
	
	MyRegisterClass(hInstance);

	// アプリケーションの初期化を実行します:
	if (!InitInstance (hInstance, nCmdShow))
	{
		return FALSE;
	}

	

	// メイン メッセージ ループ:
	while (GetMessage(&msg, NULL, 0, 0))
	{
		//if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return (int) msg.wParam;
}



//
//  関数: MyRegisterClass()
//
//  目的: ウィンドウ クラスを登録します。
//
//  コメント:
//
//    この関数および使い方は、'RegisterClassEx' 関数が追加された
//    Windows 95 より前の Win32 システムと互換させる場合にのみ必要です。
//    アプリケーションが、関連付けられた
//    正しい形式の小さいアイコンを取得できるようにするには、
//    この関数を呼び出してください。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, "MYICON");
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= "MYMENU";
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, "MYICON");

	return RegisterClassEx(&wcex);
}

//
//   関数: InitInstance(HINSTANCE, int)
//
//   目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します。
//
//   コメント:
//
//        この関数で、グローバル変数でインスタンス ハンドルを保存し、
//        メイン プログラム ウィンドウを作成および表示します。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // グローバル変数にインスタンス処理を格納します。

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
   if (!hWnd)
   {
      return FALSE;
   }
   hWndParent=hWnd;

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:  メイン ウィンドウのメッセージを処理します。
//
//  WM_COMMAND	- アプリケーション メニューの処理
//  WM_PAINT	- メイン ウィンドウの描画
//  WM_DESTROY	- 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wp, LPARAM lp)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)
	{
	case WM_CREATE:
		hWndEdit=CreateWindow("EDIT","",WS_VISIBLE | WS_CHILD |
			WS_HSCROLL | WS_VSCROLL | ES_MULTILINE | ES_WANTRETURN |
			ES_AUTOHSCROLL | ES_AUTOVSCROLL,
			0,0,0,0,hWnd,(HMENU)IDC_EDIT1000,hInst,NULL);
		if(hWndEdit==NULL)MessageBox(hWnd,"Editが作れない","error",MB_OK);
		break;
	case WM_SIZE:
		MoveWindow(hWndEdit,0,0,LOWORD(lp),HIWORD(lp),TRUE);
		break;
	case WM_COMMAND:
		wmId    = LOWORD(wp);
		wmEvent = HIWORD(wp);
		// 選択されたメニューの解析:
		switch (wmId)
		{
		case IDM_CLOSE:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wp, lp);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO: 描画コードをここに追加してください...
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wp, lp);
	}
	return 0;
}


jyosyua
記事: 65
登録日時: 14年前
住所: 八王子市
連絡を取る:

Re: WM_CREATEはいつ送られてくるのか?

#2

投稿記事 by jyosyua » 12年前

上記の例では引数の方のhWndをCreateWindowの親ハンドルで使っていますが、hWndParentだと失敗します。

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: WM_CREATEはいつ送られてくるのか?

#3

投稿記事 by dic » 12年前

わかりやすくするため、ソースを全部張ります

コード:

// mixC++サンプル.cpp : アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include "mixC++サンプル.h"

#define MAX_LOADSTRING 100

// グローバル変数:
HINSTANCE hInst;								// 現在のインターフェイス
TCHAR szTitle[MAX_LOADSTRING];					// タイトル バーのテキスト
TCHAR szWindowClass[MAX_LOADSTRING];			// メイン ウィンドウ クラス名
static	HWND	hWndEdit;
static	HWND	hWndParent;



// このコード モジュールに含まれる関数の宣言を転送します:
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK	About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

 	// TODO: ここにコードを挿入してください。
	MSG msg;
	HACCEL hAccelTable;

	// グローバル文字列を初期化しています。
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_MIXC, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);

	// アプリケーションの初期化を実行します:
	if (!InitInstance (hInstance, nCmdShow))
	{
		return FALSE;
	}

	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MIXC));

	// メイン メッセージ ループ:
	while (GetMessage(&msg, NULL, 0, 0))
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return (int) msg.wParam;
}



//
//  関数: MyRegisterClass()
//
//  目的: ウィンドウ クラスを登録します。
//
//  コメント:
//
//    この関数および使い方は、'RegisterClassEx' 関数が追加された
//    Windows 95 より前の Win32 システムと互換させる場合にのみ必要です。
//    アプリケーションが、関連付けられた
//    正しい形式の小さいアイコンを取得できるようにするには、
//    この関数を呼び出してください。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MIXC));
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_MIXC);
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

	return RegisterClassEx(&wcex);
}

//
//   関数: InitInstance(HINSTANCE, int)
//
//   目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します。
//
//   コメント:
//
//        この関数で、グローバル変数でインスタンス ハンドルを保存し、
//        メイン プログラム ウィンドウを作成および表示します。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // グローバル変数にインスタンス処理を格納します。

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   char	mes[1024];
   OutputDebugStringA( " -- InitIsntance() 1 -- \n" );
   sprintf_s( mes, "hWnd:%d\n", hWnd );
   OutputDebugStringA( mes );
   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   OutputDebugStringA( " -- InitIsntance() 2 -- \n" );
   sprintf_s( mes, "hWnd:%d\n", hWnd );
   OutputDebugStringA( mes );
   hWndParent = hWnd;

   return TRUE;
}

//
//  関数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的:  メイン ウィンドウのメッセージを処理します。
//
//  WM_COMMAND	- アプリケーション メニューの処理
//  WM_PAINT	- メイン ウィンドウの描画
//  WM_DESTROY	- 中止メッセージを表示して戻る
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;
	char	mes[80];

	switch (message)
	{
	case WM_CREATE:
		OutputDebugStringA( "WM_CREATE\n" );
		sprintf_s( mes, "hWnd:%d\n",hWnd );
		OutputDebugStringA( mes );
		sprintf_s( mes, "hWndParent:%d\n",hWndParent) ;
		OutputDebugStringA( mes );

		   hWndEdit=CreateWindow(TEXT("EDIT"),TEXT(""),WS_VISIBLE | WS_CHILD |
            WS_HSCROLL | WS_VSCROLL | ES_MULTILINE | ES_WANTRETURN |
            ES_AUTOHSCROLL | ES_AUTOVSCROLL,
            0,0,0,0,hWnd,(HMENU)NULL,hInst,NULL);
		   if(hWndEdit==NULL)
			   MessageBox(hWnd,TEXT("Editが作れない"),TEXT("error"),MB_OK);
		   break;

	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// 選択されたメニューの解析:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO: 描画コードをここに追加してください...
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

// バージョン情報ボックスのメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	UNREFERENCED_PARAMETER(lParam);
	switch (message)
	{
	case WM_INITDIALOG:
		return (INT_PTR)TRUE;

	case WM_COMMAND:
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
		{
			EndDialog(hDlg, LOWORD(wParam));
			return (INT_PTR)TRUE;
		}
		break;
	}
	return (INT_PTR)FALSE;
}


このソースコードを実行した結果が



'mixC++サンプル.exe': 'C:\Users\Owner\Desktop\mixC++サンプル\Debug\mixC++サンプル.exe' を読み込みました。シンボルが読み込まれました。
'mixC++サンプル.exe': 'C:\Windows\SysWOW64\ntdll.dll' を読み込みました。Cannot find or open the PDB file
'mixC++サンプル.exe': 'C:\Windows\SysWOW64\dwmapi.dll' を読み込みました。Cannot find or open the PDB file
WM_CREATE
hWnd:853850
hWndParent:0
'mixC++サンプル.exe': 'C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7601.17514_none_41e6975e2bd6f2b2\comctl32.dll' を読み込みました。Cannot find or open the PDB file
-- InitIsntance() 1 --
hWnd:853850
'mixC++サンプル.exe': 'C:\Program Files (x86)\Common Files\microsoft shared\IME14\IMEJP\IMJPAPI.DLL' を読み込みました。Cannot find or open the PDB file
\SHARED\IMECFM.DLL' を読み込みました。Cannot find or open the PDB file
'mixC++サンプル.exe': 'C:\Windows\SysWOW64\cryptsp.dll' を読み込みました。Cannot find or open the PDB file
-- InitIsntance() 2 --
hWnd:853850
'mixC++サンプル.exe': 'C:\Windows\SysWOW64\rsaenh.dll' を読み込みました。Cannot find or open the PDB file
\SHARED\IMECMPS.DLL' をアンロード
スレッド 'Win32 スレッド' (0xab4) はコード 0 (0x0) で終了しました。
スレッド 'Win32 スレッド' (0xed0) はコード 0 (0x0) で終了しました。
スレッド 'Win32 スレッド' (0x17d0) はコード 0 (0x0) で終了しました。
スレッド 'Win32 スレッド' (0x4e4) はコード 0 (0x0) で終了しました。
プログラム '[4288] mixC++サンプル.exe: ネイティブ' はコード 0 (0x0) で終了しました。


となっており、hWndParent を指定した場合
WM_CREATE に飛ぶと、まだ hWndParent は初期化されていませんね
CreateWindow -> WM_CREATE -> CreateWindow の続き
という流れでしょうか



「参考URL」
WM_CREATE メッセージが飛ぶタイミング
http://www.game-create.com/archives/168

WM_CREATE メッセージは CreateWindow() 関数から復帰する前に送られます。



不自然な点はありませんが、どういった問題でしょうか?
問題をはきちがえていたらすいません

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: WM_CREATEはいつ送られてくるのか?

#4

投稿記事 by ISLe » 12年前

WM_CREATEメッセージはCreateWindowの中で発生します。
ウィンドウプロシージャで通常は0を返しますが、-1を返してCreateWindowを失敗させることもできます。
jyosyua さんが書きました:つまりその時点でメインウィンドウのCreateWindowは処理を返していないのでしょうか?
そうです。
スレッドではなくSendMessageで呼び出されているのと同じかと。


わたしはハンドルの中身が何であろうとかまわないです。


(追記)
このコードで両方とも1が出力されないとおかしいと思いますか?

コード:

#include <stdio.h>
int hwnd;
int WM_CREATE(void) {
	printf("%d\n", hwnd);
	return 0;
}
int CreateWindow(void) {
	return WM_CREATE() == 0 ? 1 : 0;
}
int main(void)
{
	hwnd = CreateWindow();
	printf("%d\n", hwnd);
	return 0;
}

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: WM_CREATEはいつ送られてくるのか?

#5

投稿記事 by YuO » 12年前

jyosyua さんが書きました:つまりその時点でメインウィンドウのCreateWindowは処理を返していないのでしょうか?
なんでMSDNをあたらないんですかねぇ……。
WM_CREATE message (Windows)に,明確に
Sent when an application requests that a window be created by calling the CreateWindowEx or CreateWindow function. (The message is sent before the function returns.)
と,CreateWindowEx/CreateWindowの関数から戻る前に呼び出される,と書いてあります。

jyosyua さんが書きました:所で、今でも、ハンドルがメモリのアドレスだというページを良く見かけますが、
ttp://www.geocities.jp/ky_webid/win32c/002.html
など、違うのでしょうか?私もポインタで在って欲しいと思います。
「ttp」というschemeはどこで定義されているschemeですか。
私の勉強不足か,公式のscheme定義がどこにあるのかを見聞きしたことがありません。
後学のため,公式にどこで定義されているschemeか教えて頂けないでしょうか。

とりあえず,勝手にhttp schemeに置き換えてアクセスしましたところ,
ハンドルの正体は、実際にはただのポインタです。
とはありましたが,
jyosyua さんが書きました:所で、今でも、ハンドルがメモリのアドレスだというページを良く見かけますが、
とあるような,ポインタではなく「メモリのアドレス」であるとは,提示されたページには書いてあるようには見受けられませんでした。

HANDLEがポインタ型の変数であるのは事実ですが,
実装上どうなっているかはWindowsのカーネル等に依存します。
# Cで言うポインタですらないかもしれない
少なくとも,SDKレベルでHANDLE型の変数の値が実際にどういう値であるかは基本的に触れられていません。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: WM_CREATEはいつ送られてくるのか?

#6

投稿記事 by へにっくす » 12年前

jyosyua さんが書きました:所で、今でも、ハンドルがメモリのアドレスだというページを良く見かけますが、
ttp://www.geocities.jp/ky_webid/win32c/002.html
など、違うのでしょうか?私もポインタで在って欲しいと思います。
ここは2chではないので、ttpでなくhttpとちゃんと書いてください。
ここにいる人たちがみんな2chを知ってるわけじゃありませんので注意。
jyosyua さんが書きました:所で、今でも、ハンドルがメモリのアドレスだというページを良く見かけますが、
どこに?
メモリのアドレスと明記している箇所を教えてください。
ポインタがメモリのアドレスのことだと勘違いしてませんか?
以下のページの「変数とポインタ」のコラムを参照。
ポインタ(pointer)
written by へにっくす

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: WM_CREATEはいつ送られてくるのか?

#7

投稿記事 by ISLe » 12年前

ハンドルがポインタであって欲しいと言いながらCOLOR_WINDOW+1をHBRUSH型の値として使うのは趣旨に反していませんかね。

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: WM_CREATEはいつ送られてくるのか?

#8

投稿記事 by YuO » 12年前

ミスがあったので修正。
YuO さんが書きました:HANDLEがポインタ型の変数であるのは事実ですが,
→HANDLE型がポインタ型であるのは事実ですが,

jyosyua
記事: 65
登録日時: 14年前
住所: 八王子市
連絡を取る:

Re: WM_CREATEはいつ送られてくるのか?

#9

投稿記事 by jyosyua » 12年前

コード:

#include <stdio.h>
int hwnd;
int WM_CREATE(void) {
    printf("%d\n", hwnd);
    return 0;
}
int CreateWindow(void) {
    return WM_CREATE() == 0 ? 1 : 0;
}
int main(void)
{
    hwnd = CreateWindow();
    printf("%d\n", hwnd);
    return 0;
}
main()→CreateWindow()→WM_CREATE()この時点でグローバル変数hwndは0なので0が出力される。
WM_CREATEで0が返される。→CreateWindow()内のWM_CREATE()が0なので3項演算子により1がCreateWindow()の戻り値で返される。→main()で1が表示される。
よって、0と1だと思います。

わかりやすい説明ありがとうございます。例えが理解しにくかったですが、同じ識別子だったので理解できました。

jyosyua
記事: 65
登録日時: 14年前
住所: 八王子市
連絡を取る:

Re: WM_CREATEはいつ送られてくるのか?

#10

投稿記事 by jyosyua » 12年前

皆様ありがとうございました。おかげで納得できました。感謝です。

jyosyua
記事: 65
登録日時: 14年前
住所: 八王子市
連絡を取る:

Re: WM_CREATEはいつ送られてくるのか?

#11

投稿記事 by jyosyua » 12年前

すいません、誤解を解いておきたくて、2chへは行きません。ネットサーフィンで何かの拍子で間違ってたまたま2chのページを見たりしますが、好んで行く事は無いです。

naohiro19
記事: 256
登録日時: 14年前
住所: 愛知県

Re: WM_CREATEはいつ送られてくるのか?

#12

投稿記事 by naohiro19 » 12年前

コード:

typedef PVOID HANDLE;
このことから「HANDLEはvoid型のポインタ」といえます。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: WM_CREATEはいつ送られてくるのか?

#13

投稿記事 by へにっくす » 12年前

jyosyua さんが書きました:すいません、誤解を解いておきたくて、2chへは行きません。ネットサーフィンで何かの拍子で間違ってたまたま2chのページを見たりしますが、好んで行く事は無いです。
ttpを使った理由は?
2ch行ってる人がよく好んで使うので、誤解されるもとですよ。
今度からはちゃんとhttpとしてくださいね。
written by へにっくす

gazer

Re: WM_CREATEはいつ送られてくるのか?

#14

投稿記事 by gazer » 12年前

お前らなんでそんなに喧嘩腰なの?
ランクが高いと態度もデカくなるの?

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: WM_CREATEはいつ送られてくるのか?

#15

投稿記事 by ISLe » 12年前

gazer さんが書きました:お前らなんでそんなに喧嘩腰なの?
ランクが高いと態度もデカくなるの?
フォーラムルールには、質問は具体的かつ丁寧な言葉遣いでしていただきたいと書かれています。
あなたも同類ということでよろしいでしょうか。

閉鎖

“C言語何でも質問掲示板” へ戻る