こんにちわ。開発環境WindowsXP VisualC++.NET SDK開発です。
リストビューをサブクラス化し、クリックしたセルの色を変えようと思っています。
そこでサブクラス化したリストビューでクリックされた事を検知しようとしていますが
検知できません。
メインダイアログではWM_NOTIFY:メッセージを取得して何番目のitemかは検知できるので
すが、サブクラス化したリストビューでは反応がありません。
サブクラス化したリストビューは以下のようにしています。
もしやクリックは親ウィンドウでなければ処理出来ないのでしょうか?
//サブクラス化したList1のプロセス
int CALLBACK List1Proc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
switch(uMsg){
case WM_NOTIFY:
LPNMLISTVIEW lpnmlv;
lpnmlv=(LPNMLISTVIEW)lParam;
if((int)wParam==IDC_LIST1){
switch(lpnmlv->hdr.code){
// カラムをクリック
case LVN_COLUMNCLICK:
MessageBox(NULL,test-カラムクリック,test,MB_OK);
break;
}
}
break;
}
return (int)CallWindowProc(g_orgList1Proc,hWnd,uMsg,wParam,lParam);
}
初めて投稿します。リストビューをサブクラス化したのであれば、
case WM_NOTIFY:
LPNMHEADER lpHhder = (LPNMHEADER)lParam;
switch (lpHhder->hdr.code) {
case HDN_ITEMCLICK:
TRACE(%d列目をクリック\n, lpHhder->iItem);
break;
では無いでしょうか。(間違ってたらすいません)
色を付けるならカスタムドローってことか、
そのへん詳しくない。
WM_NOTIFYやWM_COMMANDなどは
ボタンコントロールなどがWM_LBUTTONDOWNやWM_LBUTTONUPなどを処理した結果として
親ウィンドウへ通知するために送るメッセージだろ。
どうしてもWM_NOTIFYが欲しいなら
親ウィンドウから通知する仕組みを自分で作るとか。
あるいは別の方法ないのかな。
そのへん詳しくない。
FUKUさん、wclrp ( 'o')さんありがとうございます。
色付けはオーナードローでやってまして、
リストコントロールをサブクラス化してやってます。
親ウィンドウのPROCでは上記のコードで処理出来るのですが、
他のコードも混在するので、サブクラス内で処理出来るのであれば
コードがきれいになるかなと思い質問しました。
サブクラス内で処理出来る方法があればと思い、探している所です。
>サブクラス内で処理出来る方法があればと思い、探している所です。
単純には無理です。
WM_NOTIFY が親宛のメッセージであることは既に指摘されている通りです。
なので、これも指摘されていることだけど、親宛に届いたメッセージをリストビューに
返送してやる仕組みが必要です。
MFC に「メッセージ リフレクション(メッセージ返送)」という仕組みが用意されてい
るんで、それを参考にしてみるとか。
MFCは詳しくないのですSDKのサンプルを探しています。
解決済みをチェックするのを忘れてました。
色々な手段を試行錯誤してます。 この質問は一旦締め切りとさせてもらいます。
オープンソースのタブブラウザ Donut RAPT にて、メッセージリフレクションを
利用した、リストビューのカスタムドローを行なっています。
MFC を使用せず、SDK+WTL で実装しています。
ソース内の、DownloadManager.h / MSOListViewCtrl.h/cpp がその実装です。
http://www.atmark.gr.jp/~s2000/r/files/src/#DonutRAPT_last