Win32API質問箱 Build124

■ このスレッドは過去ログ倉庫に格納されています
2017/11/11(土) 19:23:00.69ID:TpLoCFAx
Win32APIについての質問はこちらへどうぞ。

■注意
・質問する前にMSDNライブラリやPlatformSDK、Google等で検索しましょう。
・日本語版MSDN Online Libraryは不完全です。
 英語版( http://msdn.microsoft.com/en-us/library/ )の利用推奨。
・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
・言語特有の問題やIDE、MFCやVCLなどの質問はそれぞれの言語や開発環境スレで

■過去スレ
Win32API質問箱 Build123
http://mevius.2ch.net/test/read.cgi/tech/1475897582/
Win32API質問箱 Build122
http://echo.2ch.net/test/read.cgi/tech/1451988219/
Win32API質問箱 Build121
http://echo.2ch.net/test/read.cgi/tech/1438695290/
Win32API質問箱 Build120
http://echo.2ch.net/test/read.cgi/tech/1428570962/

■関連スレ
Visual Studio 2017 Part4
http://mevius.2ch.net/test/read.cgi/tech/1509244956/
【C++】 DirectX初心者質問スレ Part40 【C】
http://mevius.2ch.net/test/read.cgi/tech/1474782237/
4441
垢版 |
2017/11/25(土) 18:52:47.69ID:J6q+ZC/L
>>43
情報サンクス
しばらく様子見かな・・・
45デフォルトの名無しさん
垢版 |
2017/11/28(火) 12:44:11.35ID:EqW/cfNY
e糞plorereで再現
2017/11/28(火) 18:01:50.95ID:TWDwWwDO
た、す、け、て!
https://teratail.com/questions/102359?nli=5a1d03c4-2eb8-452f-88e5-5b2b0a000162
2017/11/28(火) 20:53:48.23ID:+N+u9Tx7
ご相談させてください。
SetDIBitsToDevice 関数を使用して、bmp を表示させてようとしています。
ここで、メモリから bmp の一行分を読み込んで、SetDIBitsDevice() にて一行分だけ表示し、
繰り返し読み込みと表示を行数分だけおこなって表示させる方法を(特に)探しています。

https://ideone.com/v0METS
にて試行していますが、画面が真っ黒になりうまくありません。

どこが悪いのでしょうか?また、SetDIBitsToDevice() の第6〜第9パラメータ

int XSrc, // 転送元長方形の左下隅の x 座標
int YSrc, // 転送元長方形の左下隅の y 座標
UINT uStartScan, // 配列内の最初の走査行
UINT cScanLines, // 走査行の数

についてヒントをいただけないでしょうか?
よろしくお願いいたします。
2017/11/28(火) 23:45:44.00ID:7WoPw74F
デフォルトだと上下が逆になってたような
49デフォルトの名無しさん
垢版 |
2017/11/29(水) 15:39:20.27ID:wmbD4JNt
ドキュメントにバグがあるやつか
2017/11/30(木) 17:09:52.13ID:52HNpdYy
>>49
「猫Winプログラム」を並行して修正しながらやっています。
というか、猫Winプログラムに乗り換えようか…
2017/12/01(金) 05:40:43.29ID:k0FZtccS
バグだらけのひどいコードだな!
>>47よ!動かないの当たり前だ!
まず、グローバル変数で、HANDLE hFileを共有する設計前提で作ってるの?

51行目からのint WINAPI WinMain内でのバグっぽいの発見!
55行目:HANDLE hFile;
ローカル変数で定義だと…?
ローカル変数で定義するなら、そのコード内でhFileをCloseHandle();なぜしていないの?
hFileをグローバル変数で使いまわすなら、55行目のHANDLE hFile;のローカル変数の定義は不要じゃねーの?
まずは、55行目を削除しろ!

グローバル変数と、ローカル変数をちゃんと理解して使いましょう!
9行目からの LRESULT CALLBACK WndProc内でのバグ
14行目:int WIDTH = 0;
アプリケーションが終了するまで、イベントごとに毎回ウインドメッセージを処理する意味で、このプロシージャー呼ばれることは理解してるよな?
仮に、ローカル変数を確保はいいとして、case WM_PAINTでWIDTHは常に0なんだけど?
24行目〜のWM_CREATE内で一度だけ初期化して値をずっと保ちたいなら14行目は、static int WIDTH=0;じゃねーの?
そもそもCALLBACK WndProcの仕組み理解してる?

24行目
WIDTH = 4 * ((bmpInfo.bmiHeader.biWidth * bmpInfo.bmiHeader.biBitCount) + 31 / 32);
はぁ…なんで意味不明な計算してるの?
WIDTH = 4 * ((bmpInfo.bmiHeader.biWidth * bmpInfo.bmiHeader.biBitCount + 31)/ 32);
こっちが正しいんじゃね?これどういう意図で計算しているかわかってる?

猫のページ見てるならまずは、動くコードをコピペして動かせよ!手打ちでバグ作ってどーする!
コード見てて、ローカル変数の使い方や、ウィンドウプロシージャの仕組みがちゃんと理解できていないように見えるので、
直ちに、ウィンドウプロシージャでググってコールバック関数とはなにかを理解することを勧める。
猫のページの7〜10ざっくりみたけどウインドメッセージとウィンドウプロシージャの詳しい説明してないので別のとこ探して読んだほうがいいぞ。
2017/12/01(金) 08:06:09.81ID:lcmprfyj
俺からも追加
SetFilePointer は ReadFile の前にしないと
2度目以降の WM_PAINT で1ライン目がおかしくなる
最近のWindowsだと「2度目以降の〜」自体そんなに来ないかもしれんが
2017/12/01(金) 08:19:52.73ID:ytACGBKw
>>51
ありがとうございます。
・hFile はこの関数(WinMain) だけで使う変数で、ここで一気にビットマップを読み込むのに使っています。確かに CloseHandle(hFilt) とした方がいいですね。

・int WIDTH = 0 はひどい、static int WIDTH にするべきでした。

・WIDTH = 4 * ((bmpInfo.bmiHeader.biWidth * bmpInfo.bmiHeader.biBitCount) + 31 / 32); これもひどいなあ…ご指摘されてはじめてまずさがわかりました。
ようはビットマップの一行の幅を 32ビット単位にする操作ですね。31をたして、全体を 32 で割って DWORD 数を出し、それに 4 をかけてバイト数を出す、
ご指摘のとおり
WIDTH = 4 * ((bmpInfo.bmiHeader.biWidth * bmpInfo.bmiHeader.biBitCount + 31)/ 32); にいたしました。

すると画面に縦じまが現れました。これは重大な進歩です、これを元にもう一度元ソースを見直します。
ありがとうございました。
2017/12/01(金) 08:51:13.54ID:ytACGBKw
>>51
>>53
すみません、hFile はグローバル変数でした。ローカル変数定義を削除しました
2017/12/01(金) 08:57:42.07ID:ytACGBKw
>>51>>53
ご指摘を受けたあたりを修正して、うまく表示できるようになりました。
コメントをいただき、ありがとうございました!
https://ideone.com/W8wuOF

>>52
SetFilePointer() は次回 WM_PAINT 時に備えたものだと考えています。
2017/12/01(金) 22:26:20.38ID:rQkaX9hI
>>46
解決したみたいだけど、デバッグの知識は身につけといた方がいいよ。
無駄な試行錯誤をする事が減って使える時間が増える。
2017/12/02(土) 19:13:30.95ID:K6qIkKEG
線だけで長方形を描画したいのですが、もっとも簡単に実現できるAPIはどれですか?
cで使えるものでお願いします
58デフォルトの名無しさん
垢版 |
2017/12/02(土) 19:16:20.77ID:XRYOyseR
copyrect
2017/12/02(土) 19:58:35.88ID:ZusnwQZ4
>>57
MoveToEx
LineTo
2017/12/02(土) 20:06:49.33ID:r+fJBrgb
ブラシをNULLにして普通にRectangle
2017/12/02(土) 20:31:13.22ID:VR8xyICx
win32APIのみなら>>59 >>60のを使うといいよ
速度重視で2d描画をしたいなら、Direct2dのAPI使ったらどうだ?線を描くならDrawLine、長方形ならDrawRectangleで描けるぞ。
62デフォルトの名無しさん
垢版 |
2017/12/03(日) 11:52:35.88ID:cCU4BKBm
jpg や png などの2D静止画を高速描画するのに最も適したライブラリってどれだろう?
gdiplus? DirectX?
2017/12/03(日) 12:14:03.55ID:I8IEjg5G
ハードウェア描画前提ならdirectXじゃないかなー
wikiでgdiを調べると詳しく書いてあるかもよ。
好きなライブラリー使えばいいよ。
2017/12/03(日) 12:26:39.95ID:FVppKXn3
最終的にはメモリDCに書き込んだのをBitBlt()するのが組みやすい
フォーマット変換だけならwicやOpenCV
65デフォルトの名無しさん
垢版 |
2017/12/03(日) 12:47:14.81ID:cCU4BKBm
メモリDCで作業してるのに、スレッド排他ロックでアプリ側のマルチスレッド実装を台無しにしてくれるgdiplus
2017/12/03(日) 13:01:46.59ID:FVppKXn3
jpgだとJpegTurboってのがあって、それなりに速かった
jpgで画像を連続で送ってくるカメラがあって、それで試しに使ったことがある
2017/12/03(日) 16:05:28.97ID:FvsK2hd0
>>62
表示だけならライブラリ探さなくてもOleLoadPicture()で読み込んでDCにIPicture::Renderするだけでいいんじゃないか?
68デフォルトの名無しさん
垢版 |
2017/12/03(日) 19:28:19.70ID:WsUY0GNs
>60 1pixel小さいです
2017/12/03(日) 20:10:00.66ID:S5PX0FVt
可哀想な頭だ
70デフォルトの名無しさん
垢版 |
2017/12/04(月) 15:02:45.68ID:6cKdvMQZ
メモリDCへの拡大縮小画像のレンダリングを高速に実現する最適な方法ってなんなのだろう?
ちなみにGDI+ gdiplusは論外。GraphicクラスでメモリDC渡してレンダリングすると、GDI+がスレッドロックするので並列化による省時間はできない。
2017/12/04(月) 15:23:27.29ID:1/3RfdNR
最適ならDirectX一択だろ
最速になると描画よりも拡大縮小アルゴリズムの話になりそう
72デフォルトの名無しさん
垢版 |
2017/12/04(月) 16:26:01.49ID:6cKdvMQZ
>>67 の方が教えてくれた IPicture::Render はWindows2000時代からあるレンダリングAPIという認識。
わざわざVista時代にDirect2dをリリースした意味は何なのか、という疑問がありまして、その辺どうなの、と。
2017/12/04(月) 19:17:48.59ID:7Hssi5iQ
32bitARGB画像ならDirect2Dだな、小数点座標指定できるし。
Direct2DのAPIではピクセルフォーマット変換とかHeight方向反転とかできなかったと思うので
異なる場合には渡す前に変換しておく必要がある
74デフォルトの名無しさん
垢版 |
2017/12/04(月) 20:29:21.18ID:6cKdvMQZ
せめて有名Webブラウザ並みの描画速度で複数画像を一覧表示できてほしいんだけど、その点、gdiplusはダメダメ。
Wikipediaなどの情報によると有名WebブラウザはDirect2Dによる描画らしいので、Direct2Dがいいのかな。
2017/12/04(月) 21:10:25.84ID:1/3RfdNR
今作ってるソフトの遅い部分が「描画」でそこを改善したいんじゃなくて、たぶんこれから作るソフトの計画だよな
ある程度形になってからどこに時間食ってるか調べてそこを潰したほうが開発時間も動作速度もいいと思うな
2017/12/04(月) 22:09:44.67ID:5YKgC1OQ
>Direct2DのAPIではピクセルフォーマット変換とかHeight方向反転とかできなかったと思うので
当然SetTransformはあるしなんなら自分で書いたシェーダを挿入できるエフェクトグラフもあるでよ?
2017/12/04(月) 22:43:49.45ID:7Hssi5iQ
>>76
SetTransformで鏡像反転できるのか
マトリクス係数考えてみるわ
2017/12/04(月) 22:54:06.06ID:m/z1wPSa
考えるもなにも普通にスケール-1ちゃうんか
2017/12/04(月) 23:12:40.00ID:7Hssi5iQ
>>78
oh www
2017/12/05(火) 01:55:50.52ID:x6DQdw1l
低レベルな話ですみません。

ダイアログアプリケーション(calc.exe と同様)
を win32api/C で書いています。

希望:ベースのダイアログの色を起動後に変えたい。

したこと: WM_CTLCOLORSTATICを捕らえて、
SetBkColor((HDC)wp, BackGroundColorG); および
return HBRUSH / HBRUSH を DefWindowProc() に渡さずに返す

以上で、スタティックコントロールの背景色およびエディットコントロールのディスエイブル時の背景色は変わりました。

しかし、ベースダイアログの色は変わりません。
頭で、RegisterClass() にわたす前に設定する WNDCLASS の hbrBackground の値が、ダイアログのCreateWindow() の後も反映されています。

後から
SetClassLongPtr((HWND)lp, GCL_HBRBACKGROUND, (LONG)hbrBackGroundS)
しても反映されないことを確認しています。

起動後にダイアログの色を変えるにはどうすればいいでしょうか?
明日には再現コードをお見せできると思います。
アドバイスいただきたくよろしくお願いいたします。

#WINDCLASS.hbrBackground = NULL にすると、透けてデスクトップが移りこみ、これはこれで面白いです…もう寝ます
81デフォルトの名無しさん
垢版 |
2017/12/05(火) 02:14:11.47ID:7/1p3S3k
>>80
WM_CTLCOLORDLG でブラシを返す
2017/12/05(火) 03:59:00.03ID:x6DQdw1l
>>81
コメントいただき感謝しています。
試してみたのですが、よくありません。やはりダイアログは WNDCLASS.hbrBackground の指定が優先されています。

現象を再現させたコード次のとおりです。こちらでは cygwin/mingw 32 ビットでコンパイルしています。
test.c https://ideone.com/pch378
test.h https://ideone.com/1iKq2z
test.rc https://ideone.com/kZH3Uf
makefile https://ideone.com/9MDXT0
2017/12/05(火) 04:05:08.93ID:KBxdaLdg
WM_ERASEBKGND
84デフォルトの名無しさん
垢版 |
2017/12/05(火) 04:43:50.94ID:wJV4W7rZ
ここ参照

https://stackoverflow.com/questions/20519533/change-the-background-color-of-a-dialog-box-win32api

Tab キーによるフォーカス移動などを司る IsDialogMessage を呼んでいる辺りも注目
2017/12/05(火) 07:11:29.40ID:x6DQdw1l
>>81, >>83-84
コメントありがとうございます。
状況が変わりました。すなわち、

1. DefWindowProc() ではなく、DefDialogProc() にする
2. (>>81) WM_CTLCOLORDLG メッセージ処理(ブラシを返す)

によりダイアログのベースの色が変わりました。
現在典拠を探しています。

遅いところ皆様ありがとうございました。勇気がでてきました!
https://ideone.com/ZBuhbz

>>84
StackOverflow のプログラム例は、(通常)ウィンドウがあって、そこから CreateDialog で新しくモードレスダイアログを作るときの作法ですね。
IsDailogMessage() が必要かどうかは、まだよくわかりません。
86デフォルトの名無しさん
垢版 |
2017/12/05(火) 07:41:30.27ID:S7FU9Yl0
大雑把に言うと WindowProc に来る前 DefDlgProc が
値を返しちゃうので色が変わらないわけです (多分)。

他にも DefDlgProc が反応するメッセージについては WindowProc ではなく DlgProc で処理する必要があります。
どれがそうか一覧等あるのかは知りませんが。
2017/12/08(金) 17:59:18.20ID:UBTxsLd5
フルスクリーンでも、色の取得ができるAPIは存在しないのでしょうか?
GetPixelを試みましたが、何故かフルスクリーン対象にすると 常に0を返されます

フルスク色取得が可能なapi、もしくはGetPixelでも出来るのでしたらやり方を教えてください
88デフォルトの名無しさん
垢版 |
2017/12/08(金) 21:57:36.41ID:TcYdv7Hd
MemDC にコピーしてから好きに弄ぶ
2017/12/09(土) 12:37:57.44ID:nuTX+Pqx
できましたありがとう
90デフォルトの名無しさん
垢版 |
2017/12/09(土) 22:01:16.23ID:Lkee30cD
質問です。
あるソフトがしたUSBの出力を、コンピュータの外部ではなくそのコンピュータ内の他のソフトへリダイレクトすることはできますでしょうか?
2017/12/09(土) 22:33:28.46ID:rMepMJ5T
>>90
方法1 (「あるソフト」にパッチが可能なら)
CreateFile()/WriteFile()などをフックする。
ただし、これらはKernel32.dllにあるAPIなので通常の方法ではフックできない。
「あるソフト」内のByte列"Kernel32.dll"を(例えば)"Xernel32.dll"に書き換え、
Xernel32.dllを作成・フックする。

方法2
対象デバイス用デバイスドライバと同じAPIを持ち、かつその入出力を「他のソフト」
へ受け渡すAPIを持つデバイスドライバを作成する。

方法3 (本物のUSBデバイスも生かしておくなら)
フィルタードライバーを作成し、そこで「あるソフト」の出力を盗み見る。
2017/12/09(土) 23:13:14.29ID:ntUKDUa2
kernelにあっても普通にインジェクトでフックできるような・・・
2017/12/09(土) 23:53:32.26ID:ntUKDUa2
と、書き込んでからプロキシ思い出した。あれ64bitのは作るの面倒すぎだけど32だったらありだな
94デフォルトの名無しさん
垢版 |
2017/12/10(日) 04:43:00.48ID:Ivp7Fyt3
USBハブで物理的にteeすることって可能なんだろうか
2017/12/10(日) 04:49:03.51ID:jPbEe7nV
Window API Hook で検索すればすぐ出てくるけど API のフックはかなり簡単にできる
DLL インジェクション併用で CreateFile / WriteFile をフックするのがいいかもね
2017/12/10(日) 09:52:56.38ID:tk0MZw2P
> ・APIフックなど高度な事をしたい場合はできるだけAdvenced Windowsを読みましょう。
テンプレのこれいるか?ってほど簡単にできるしな

1つのページを見るだけではできなくても
いくつかのページの情報を自分なりにまとめたらできるようになる
97デフォルトの名無しさん
垢版 |
2017/12/10(日) 10:07:01.58ID:0DY65cdk
皆さまありがとうございました
APIフックを試します
2017/12/10(日) 10:07:15.33ID:0xn5varO
>>94
usbアナライザ
2017/12/10(日) 19:23:15.93ID:NAV3AZ5L
うーむ、やっとコンパイルできた…
32ビットコードは 32ビットのODBCデータソースしかみないし
64ビットコードは 64ビットのODBCデータソースしかみないのか…

手持ちの excel は 32ビットで、見に行くODBC テーブルは 32 ビット用であったことが混迷に拍車をかけてしまっていた
cigwin の odbcライブラリとしては -lodbc32 でコンパイルしているが、32ビットなのか 64 ビットなのか、いったいどうなっているんだ?!
2017/12/10(日) 20:10:47.46ID:NCCsPX6A
shell32.dll とか kernel32.dll とかもそうだし、
32→64 ビットではモジュールの名前変わらなかったからね
2017/12/10(日) 20:15:22.78ID:mhuWrsB5
dumpbin 使え。
2017/12/10(日) 20:23:53.29ID:bN2Fk6CS
>-lodbc32 でコンパイル

これで実行時に見に行くのが 32 になるか 64 になるかは決まらない
いわんか wow64 を見るのか system32 を見るのかをや
2017/12/12(火) 10:54:59.64ID:dxitcW2N
WS_POPUPの子ウィンドウって、
親ウィンドウからはGetNextWindow()などのループで辿っていけないものですか?
GW_ENABLEDPOPUPだと、見えているものしか出てこないようです。
2017/12/12(火) 11:15:35.06ID:79jDOY0/
見えてる=enabled popup
ってことなんだな。普通にGW_CHILD使えばいいじゃん
2017/12/12(火) 11:48:53.11ID:dxitcW2N
>>104
GW_CHILDだとWS_POPUPのやつは出てこないようです
2017/12/12(火) 12:27:55.11ID:RQRbm0+h
人間は見えるものしか見ない
馬鹿は観たいものしか見ない
2017/12/12(火) 12:33:23.81ID:pbeXhwoZ
EnumWindows、EnumChildWindows推奨。
2017/12/12(火) 13:04:46.42ID:79jDOY0/
ためしたらまじでgw_childだめなんだなw
全ウインドウの親見てくのか
2017/12/12(火) 13:05:49.05ID:dxitcW2N
>>107
デスクトップの子ウィンドウを巡っていって、
片っ端からその親を調べていくしかないってことですか?
2017/12/12(火) 14:01:58.99ID:pbeXhwoZ
EnumChildWindowsだけでいっか。
2017/12/13(水) 19:25:57.66ID:oFXUjnGM
>>99
引き続き ODBC まわりを触っている
コンパイラの警告を黙らせるために、いい加減に適当にキャストしていたのが、バグ(c++ delete が失敗する)のもとになっていた
ああ、ダウンキャスト/アップキャストの区別がつかない、こまったこまった
2017/12/14(木) 06:12:13.99ID:fEY/FzHm
(´・ω・`)知らんがな
2017/12/20(水) 21:21:04.61ID:8hKmNCKf
ODBC を完全に把握した
しかし、面倒なので jdbc を使うことにした…
114デフォルトの名無しさん
垢版 |
2017/12/24(日) 20:20:35.24ID:lhIRobpu
IsWindows10OrGreater関数を、
Windows10最新版(build16299)で使用すると、
Windows10にも関わらずfalseが返ってきます。
原因に心当たりのある聡明なお方はいらっしゃいませんか…?
2017/12/24(日) 20:23:06.42ID:gjaYlpPe
>>114
http://yamatyuu.net/computer/program/sdk/base/GetVersionEx/index.html
2017/12/24(日) 20:45:24.50ID:gjaYlpPe
GetVersionExはウソつきだが、OSのバージョン番号に依存するアプリは地獄へ行かねばならぬ。
2017/12/24(日) 21:23:48.92ID:Y4i+PXlu
質問に対する答えを書かないアホは地獄行きだバカ
2017/12/24(日) 21:46:03.09ID:wguJVDMb
それapiじゃなくてVersionHelpers.hにある関数じゃないか?デバッグして何かえってるか見ろ
2017/12/24(日) 22:22:12.25ID:VzvV4f9p
VersionHelpers.hの実装はVerifyVersionInfoだけどどのみちマニフェストでの指定は必要ってだけやね
2017/12/27(水) 18:30:50.24ID:tTz9yXWR
GetCursorPos ってマルチモニタに対応してるんですかね?
2017/12/27(水) 18:43:39.90ID:b9N+03Hh
>>120
している。仮想スクリーンの座標系になる。
2017/12/27(水) 19:06:57.63ID:b9N+03Hh
>>121
ウソを書いてしまった。ごめんなさい。
仮想スクリーンではなく、プライマリーなスクリーン座標になる。
https://msdn.microsoft.com/en-us/library/windows/desktop/dd145136.aspx
これとSM_XVIRTUALSCREENとSM_YVIRTUALSCREENを使って座標値をずらすと仮想スクリーン座標が得られる。
2017/12/27(水) 19:42:44.76ID:tTz9yXWR
>>122
ありがとうございます!!
2017/12/31(日) 00:31:58.10ID:iQxViKH1
あれでうまく動いたのか?
125デフォルトの名無しさん
垢版 |
2018/01/01(月) 14:03:42.43ID:yaUpEKWz
あけおめ
2018/01/06(土) 01:36:21.17ID:d+dr+APG
しっかし、おっさん臭いスレだな
2018/01/06(土) 09:18:28.54ID:Pup7wZC7
若者はモバイルだからな
2018/01/06(土) 17:57:07.19ID:OwgVV/3f
モバイルカテゴリの人がWindows関連スレを覗きに来るか?
2018/01/13(土) 20:37:47.18ID:9/EYlaQy
win32api の記述を C から C++ に移行中です
CreateWindow() が hwnd を返すタイミングより先に、ウィンドウプロシージャに WM が流れ始めることを特定するのに時間がかかりました…
2018/01/13(土) 22:36:08.61ID:TKXLfFcD
>>129
20年前位にやったなあ
WindowProc
DialogProc
ThreadProc
****Callback
この辺を包んでクラス化

ウィンドウの場合
CreateWindowのパラメータでクラスのポインタを渡し
WM_CREATEで受け取るって感じ
2018/01/13(土) 22:55:08.82ID:9/EYlaQy
>>130
そうです、それです!WNDCLASS.cbWndExtra を使うのがミソです!

CreateWindow(..... 最後 (Derived)this);

extern "C" long CALLBACK WindProc(...) {
if (msg == WM_CREATE) {
p = (Derived*)((LPCREATESTRUCT)lp)->lpCreateParams;
SetWindowLong(hwnd, 0, (LONG)p);
p->hwnd = hwnd // これを見つけるのが大変だった
.
} else {
p = GetWindowLong(hwnd, 0)
return p->WindowProc() // goto Derived::WindowProc()
}
Derived::WindowProc() {
this->Base::WindowProc()

virtual Base::WindowProc() {
HWND hwnd // member instance variable
return ::DefWindowProc(this->hwnd, mwg, wp, lp);

温故知新…
2018/01/14(日) 00:26:50.32ID:TQ+v9n4/
厳密にはWM_CREATEの前にもいくつかメッセージ飛んでくるけどね
2018/01/14(日) 00:44:30.50ID:ekN/OeXo
>>132
了解!そういうのは全部まとめて ::DefWindowProc() に流しちゃっているのでダイジョブです!
134デフォルトの名無しさん
垢版 |
2018/01/14(日) 02:25:37.15ID:yVTJx4nd
この行いらね
HWND hwnd // member instance variable
2018/01/14(日) 08:36:59.72ID:ekN/OeXo
>>134
ごめんなさい >>131 ははおって書いたので、内容が今一つはっきりしなかったこと謝罪いたします。
その行は、自作 Window クラスのメンバとして書いたつもり、Window クラスに hwnd を持たせたいと考えているのです
2018/01/14(日) 16:42:02.47ID:hYyI16IJ
片山先生の MZC4 みたいなのを作ってるわけね
2018/01/14(日) 17:06:39.99ID:ekN/OeXo
>>136
はい
https://github.com/katahiromz/MZC4/blob/master/include/MWindowBase.hpp をみました
私の趣向としては、hwnd は完全に隠蔽したい、そのため WNDCLASS.cbWndExtra をあえて使うことになります
2018/01/15(月) 01:09:31.49ID:rJu9VjYT
cbWndExtra == 0なウィンドウには使えないから、結局、設計思想が間違っている。
2018/01/15(月) 03:14:12.16ID:dcGpNZle
GWLP_USERDATAをライブラリ側で潰してる時点で同レベルだな
2018/01/15(月) 03:19:04.90ID:rJu9VjYT
しかし、ハンドルマップにしたら、コストがかかるんだよな。
2018/01/15(月) 03:40:01.33ID:dcGpNZle
他人に設計思想が間違ってると宣いつつ自分は即座に言い訳
さすがカス山
2018/01/15(月) 08:03:32.90ID:ss1wTrUG
MFCはハンドルマップ
2018/01/15(月) 08:53:13.95ID:SI03IcDF
ATL方式もあるよ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況