トップページ > プログラム > 2015年02月21日 > JFEpwQ1f

書き込み順位&時間帯一覧

26 位/263 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000000003100000004



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
Win32API質問箱 Build11 [転載禁止]©2ch.net

書き込みレス一覧

Win32API質問箱 Build11 [転載禁止]©2ch.net
485 :デフォルトの名無しさん[sage]:2015/02/21(土) 15:11:43.45 ID:JFEpwQ1f
俺は、GWLP_USERDATAでthisを登録して、メンバ関数でウィンドウプロシージャを定義できるようにしたけど、
CreateWindowの中でもウィンドウプロシージャ呼ばれるから注意な
結局、CreateWindow呼ぶ前にstatic変数にthisを入れてCreateWindowの中でウィンドウプロシージャが呼ばれたときは、
static変数のthisを使うようにしたけど、気持ち悪いな。もっといい方法あるんだろうか
Win32API質問箱 Build11 [転載禁止]©2ch.net
490 :デフォルトの名無しさん[sage]:2015/02/21(土) 15:47:24.94 ID:JFEpwQ1f
>>488
WTLはどうやってるの?
Win32API質問箱 Build11 [転載禁止]©2ch.net
491 :デフォルトの名無しさん[sage]:2015/02/21(土) 15:58:48.77 ID:JFEpwQ1f
>>487
こんな感じか。こっちのほうがだいぶいいね
LRESULT CALLBACK WindowBase::RealWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 WindowBase* pThis = (WindowBase*)GetWindowLongPtr(hWnd, 0);
 if(pThis == NULL) {
  if(msg == WM_CREATE || msg == WM_NCCREATE) {
   CREATESTRUCT* ptr = (CREATESTRUCT*)lParam;
   SetWindowLongPtr(hWnd, 0, (ULONG_PTR)ptr->lpCreateParams);
   pThis = (WindowBase*)ptr->lpCreateParams;
   pThis->m_hWnd = hWnd;
  }
 }
 if( pThis ){
  _ASSERT( pThis->m_hWnd == hWnd );
  return pThis->WndProc(msg, wParam, lParam);
 }
 return 0L;
}
Win32API質問箱 Build11 [転載禁止]©2ch.net
493 :デフォルトの名無しさん[sage]:2015/02/21(土) 16:28:16.67 ID:JFEpwQ1f
>>492
これは面白いなw
まじめにやろうとするとコード生成まで必要になるとか、Win APIどんだけアホな設計なんだって思う(まぁ古いから仕方ないんだが)

つまり、最初(CreateWindowで呼ばれた時)は、スレッドごとのグローバル変数にインスタンスへの参照を持っていおいて、
最初にウィンドプロシージャが呼ばれた時に、ウィンドウプロシージャをコード生成で生成した関数に置き換えるってことだな

WTLはCreateWindowのlpParamじゃなくて、static変数のほうだったか。やっぱりコード戻すわ


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。