水無瀬の部屋 > Programming > sample > tools > ctrl > picker > picker.cpp |
---|
1: //*********************************************************
2: // プロジェクト: picker
3: // ファイル名: picker.cpp
4: //*********************************************************
5: #include <ctrl/picker/picker.h>
6: #include <header/tooldbg.h> // ASSERT(), VERIFY(),
7: #include <header/toolbase.h> //
8: #include <header/toolwind.h>
9:
10:
11: //---------------------------------------------------------
12: // マクロ の 定義
13: //---------------------------------------------------------
14: #define PROP_ORIGINALPROC "PCPROP_ORIGINALPROC"
15:
16:
17: //---------------------------------------------------------
18: // ファイルスコープ関数 の 宣言
19: //---------------------------------------------------------
20: static LRESULT Picker_SendBeginDragMessage( HWND hWnd );
21: static LRESULT Picker_SendEndDragMessage( HWND hWnd );
22: static LRESULT Picker_SendContextMenuMessage( HWND hWnd );
23: static LRESULT Picker_SendRightClickMessage( HWND hWnd );
24: static LRESULT Picker_SendDroppedMessage( HWND hWnd );
25: static LRESULT Picker_SendMouseMoveMessage( HWND hWnd, WPARAM wParam, LPARAM lParam );
26: static LRESULT Picker_SendKeyDownMessage( HWND hWnd, WPARAM wParam, LPARAM lParam );
27: static LRESULT CallOriginalProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
28: static LRESULT CALLBACK PickerProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
29:
30:
31: //*********************************************************
32: // SubclassPickerCtrl
33: //*********************************************************
34: bool
35: SubclassPickerCtrl
36: (
37: HWND hWnd
38: )
39: {
40: // パラメタの仮定
41: ASSERT( IsValidWindow( hWnd ) );
42:
43: WNDPROC OriginalProc = SubclassWindow64( hWnd, PickerProc );
44: VERIFY( SetProp( hWnd, PROP_ORIGINALPROC, OriginalProc ) );
45: return true;
46: }//SubclassPickerCtrl
47:
48:
49: //******************************************************************************************************************
50: // private
51: //******************************************************************************************************************
52: static LRESULT OnPickerDestroy( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
53: static LRESULT OnPickerMouseMove( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
54: static LRESULT OnPickerLeftButtonDown( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
55: static LRESULT OnPickerLeftButtonUp( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
56: static LRESULT OnPickerCaptureChanged( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
57: static LRESULT OnPickerKeyDown( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
58: static LRESULT OnPickerRightButtonUp( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
59: static LRESULT OnPickerNotify( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
60: static LRESULT OnPickerNotifyKeyDown( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
61: static LRESULT OnPickerNotifyKeyDownApps( HWND hWnd, LPARAM lParam );
62: static LRESULT OnPickerNotifyRightClick( HWND hWnd, LPARAM lParam );
63:
64:
65: //*********************************************************
66: // PickerProc
67: //*********************************************************
68: static
69: LRESULT
70: CALLBACK
71: PickerProc
72: (
73: HWND hWnd,
74: UINT uMsg,
75: WPARAM wParam,
76: LPARAM lParam
77: )
78: {
79: // パラメタの仮定
80: ASSERT( IsValidWindow( hWnd ) );
81:
82: switch( uMsg )
83: {
84: case WM_DESTROY: return OnPickerDestroy( hWnd, uMsg, wParam, lParam );
85: case WM_NOTIFY: return OnPickerNotify( hWnd, uMsg, wParam, lParam );
86: case WM_KEYDOWN: return OnPickerKeyDown( hWnd, uMsg, wParam, lParam );
87: case WM_MOUSEMOVE: return OnPickerMouseMove( hWnd, uMsg, wParam, lParam );
88: case WM_LBUTTONDOWN: return OnPickerLeftButtonDown( hWnd, uMsg, wParam, lParam );
89: case WM_LBUTTONUP: return OnPickerLeftButtonUp( hWnd, uMsg, wParam, lParam );
90: case WM_RBUTTONUP: return OnPickerRightButtonUp( hWnd, uMsg, wParam, lParam );
91: case WM_CAPTURECHANGED: return OnPickerCaptureChanged( hWnd, uMsg, wParam, lParam );
92: default: return CallOriginalProc( hWnd, uMsg, wParam, lParam );
93: }
94: }//PickerProc
95:
96: //*********************************************************
97: // OnPickerDestroy - WM_DESTROY
98: //*********************************************************
99: static
100: LRESULT
101: OnPickerDestroy
102: (
103: HWND hWnd,
104: UINT uMsg,
105: WPARAM wParam,
106: LPARAM lParam
107: )
108: {
109: // パラメタの仮定
110: ASSERT( IsValidWindow( hWnd ) );
111: ASSERT( WM_DESTROY == uMsg );
112:
113: // サブクラス化の解除
114: WNDPROC OriginalProc = (WNDPROC)GetProp( hWnd, PROP_ORIGINALPROC );
115: VERIFY( RemoveProp( hWnd, PROP_ORIGINALPROC ) );
116: VERIFY( SubclassWindow64( hWnd, OriginalProc ) );
117:
118: return CallWindowProc( OriginalProc, hWnd, uMsg, wParam, lParam );
119: }//OnPickerDestroy
120:
121: //*********************************************************
122: // OnPickerKeyDown
123: //*********************************************************
124: static
125: LRESULT
126: OnPickerKeyDown
127: (
128: HWND hWnd,
129: UINT uMsg,
130: WPARAM wParam,
131: LPARAM lParam
132: )
133: {
134: // パラメタの仮定
135: ASSERT( IsValidWindow( hWnd ) );
136: ASSERT( WM_KEYDOWN == uMsg );
137: ASSERT( hWnd == GetFocus() );
138: ASSERT( IsValidKeyDownMessageParam( wParam, lParam ) );
139:
140: // ドラッグ中
141: if ( hWnd == GetCapture() )
142: return CallOriginalProc( hWnd, uMsg, wParam, lParam );
143:
144: // 親へ WM_KEYDOWN を通知
145: Picker_SendKeyDownMessage( hWnd, wParam, lParam );
146: return CallOriginalProc( hWnd, uMsg, wParam, lParam );
147: }//OnPickerKeyDown
148:
149: //*********************************************************
150: // OnPickerMouseMove - WM_MOUSEMOVE
151: // D&Dの中
152: //*********************************************************
153: static
154: LRESULT
155: OnPickerMouseMove
156: (
157: HWND hWnd,
158: UINT uMsg,
159: WPARAM wParam,
160: LPARAM lParam
161: )
162: {
163: // パラメタの仮定
164: ASSERT( IsValidWindow( hWnd ) );
165: ASSERT( WM_MOUSEMOVE == uMsg );
166:
167: // 通常時
168: if ( hWnd != GetCapture() )
169: return CallOriginalProc( hWnd, uMsg, wParam, lParam );
170:
171: // 親へ PCN_MOUSEMOVE を通知
172: Picker_SendMouseMoveMessage( hWnd, wParam, lParam );
173: return CallOriginalProc( hWnd, uMsg, wParam, lParam );
174: }//OnPickerMouseMove
175:
176: //*********************************************************
177: // OnPickerLeftButtonDown - WM_LBUTTONDOWN
178: // D&Dの開始
179: //*********************************************************
180: static
181: LRESULT
182: OnPickerLeftButtonDown
183: (
184: HWND hWnd,
185: UINT uMsg,
186: WPARAM wParam,
187: LPARAM lParam
188: )
189: {
190: // パラメタの仮定
191: ASSERT( IsValidWindow( hWnd ) );
192: ASSERT( WM_LBUTTONDOWN == uMsg );
193:
194: // 親へD&Dの開始を通知
195: if ( 0 != Picker_SendBeginDragMessage( hWnd ) )
196: return false; // キャンセルされた
197:
198: SetCapture( hWnd );
199: return CallOriginalProc( hWnd, uMsg, wParam, lParam );
200: }//OnPickerLeftButtonDown
201:
202: //*********************************************************
203: // OnPickerLeftButtonUp - WM_LBUTTONUP
204: // ドロップ
205: //*********************************************************
206: static
207: LRESULT
208: OnPickerLeftButtonUp
209: (
210: HWND hWnd,
211: UINT uMsg,
212: WPARAM wParam,
213: LPARAM lParam
214: )
215: {
216: // パラメタの仮定
217: ASSERT( IsValidWindow( hWnd ) );
218: ASSERT( WM_LBUTTONUP == uMsg );
219:
220: if ( hWnd == GetCapture() )
221: {
222: // 親へドロップを通知
223: Picker_SendDroppedMessage( hWnd );
224: VERIFY( ReleaseCapture() );
225: }
226: return CallOriginalProc( hWnd, uMsg, wParam, lParam );
227: }//OnPickerLeftButtonUp
228:
229: //*********************************************************
230: // OnPickerRightButtonUp - WM_RBUTTONUP
231: //*********************************************************
232: static
233: LRESULT
234: OnPickerRightButtonUp
235: (
236: HWND hWnd,
237: UINT uMsg,
238: WPARAM wParam,
239: LPARAM lParam
240: )
241: {
242: // パラメタの仮定
243: ASSERT( IsValidWindow( hWnd ) );
244: ASSERT( WM_RBUTTONUP == uMsg );
245:
246: // ドラッグ中
247: if ( hWnd == GetCapture() )
248: return 0;
249: ASSERT( hWnd != GetCapture() );
250:
251: // 親へ右クリックを通知
252: Picker_SendRightClickMessage( hWnd );
253: return CallOriginalProc( hWnd, uMsg, wParam, lParam );
254: }//OnPickerRightButtonUp
255:
256: //*********************************************************
257: // OnPickerCaptureChanged - WM_CAPTURECHANGED
258: // D&D状態の終了(ドロップとは限らない)
259: //*********************************************************
260: static
261: LRESULT
262: OnPickerCaptureChanged
263: (
264: HWND hWnd,
265: UINT uMsg,
266: WPARAM wParam,
267: LPARAM lParam
268: )
269: {
270: // パラメタの仮定
271: ASSERT( IsValidWindow( hWnd ) );
272: ASSERT( WM_CAPTURECHANGED == uMsg );
273:
274: HWND hCapture = reinterpret_cast<HWND>( lParam );
275: if ( hWnd != hCapture )
276: {
277: // 親へD&Dの終了を通知
278: Picker_SendEndDragMessage( hWnd );
279: VERIFY( InvalidateRect( hWnd, null, false ) );
280: }
281:
282: return CallOriginalProc( hWnd, uMsg, wParam, lParam );
283: }//OnPickerCaptureChanged
284:
285:
286: //******************************************************************************************************************
287: // REFLECT
288: //******************************************************************************************************************
289: //*********************************************************
290: // OnPickerNotify - WM_NOTIFY
291: // 子ウィンドウから通知メッセージを受け取った。
292: // 返値の意味は通知メッセージの種類による。
293: // int wParam …… メッセージを通知してきたウィンドウの識別子
294: // NMHDR *lParam …… 通知メッセージ構造体へのポインタ
295: //*********************************************************
296: static
297: LRESULT
298: OnPickerNotify
299: (
300: HWND hWnd,
301: UINT uMsg,
302: WPARAM wParam,
303: LPARAM lParam
304: )
305: {
306: // パラメタの仮定
307: ASSERT( IsValidWindow( hWnd ) );
308: ASSERT( IsValidNotifyMessageParam( wParam, lParam ) );
309: ASSERT( IsWindowNotifyMessageParam( hWnd, lParam ) );
310: ASSERT( IsValidPtr( (NMPICKER *)lParam, sizeof( NMPICKER ) ) );
311: ASSERT( wParam == (UINT)GetDlgCtrlID( hWnd ) );
312: ASSERT( WM_NOTIFY == uMsg );
313:
314: const UINT uNotifyCode = GetNotifyMessageNotifyCode( lParam );
315: switch( uNotifyCode )
316: {
317: case PCN_KEYDOWN: return OnPickerNotifyKeyDown( hWnd, uMsg, wParam, lParam );
318: case PCN_RCLICK: return OnPickerNotifyRightClick( hWnd, lParam );
319: default: return CallOriginalProc( hWnd, uMsg, wParam, lParam );
320: }
321: }//OnPickerNotify
322:
323: //*********************************************************
324: // OnPickerNotifyKeyDown
325: //*********************************************************
326: static
327: LRESULT
328: OnPickerNotifyKeyDown
329: (
330: HWND hWnd,
331: UINT uMsg,
332: WPARAM wParam,
333: LPARAM lParam
334: )
335: {
336: // パラメタの仮定
337: ASSERT( IsValidWindow( hWnd ) );
338: ASSERT( IsValidPtr( (NMPICKER *)lParam, sizeof( NMPICKER ) ) );
339: ASSERT( IsWindowNotifyMessageParam( hWnd, lParam ) );
340: ASSERT( PCN_KEYDOWN == GetNotifyMessageNotifyCode( lParam ) );
341: ASSERT( wParam == (UINT)GetDlgCtrlID( hWnd ) );
342: ASSERT( WM_NOTIFY == uMsg );
343:
344: const NMPICKER *nmpc = reinterpret_cast<NMPICKER *>( lParam );
345: switch( nmpc->wParam )
346: {
347: case VK_APPS: return OnPickerNotifyKeyDownApps( hWnd, lParam );
348: default: return CallOriginalProc( hWnd, uMsg, wParam, lParam );
349: }
350: }//OnPickerNotifyKeyDown
351:
352: //*********************************************************
353: // OnPickerNotifyKeyDownApps
354: //*********************************************************
355: static
356: LRESULT
357: OnPickerNotifyKeyDownApps
358: (
359: HWND hWnd,
360: LPARAM _unuse( lParam )
361: )
362: {
363: // パラメタの仮定
364: ASSERT( IsValidWindow( hWnd ) );
365: ASSERT( IsValidPtr( (NMPICKER *)lParam, sizeof( NMPICKER ) ) );
366: ASSERT( IsWindowNotifyMessageParam( hWnd, lParam ) );
367: ASSERT( VK_APPS == ((NMPICKER *)lParam)->wParam );
368: ASSERT( PCN_KEYDOWN == GetNotifyMessageNotifyCode( lParam ) );
369:
370: // 親へ PCN_CONTEXTMENU を通知
371: Picker_SendContextMenuMessage( hWnd );
372: return 0L;
373: }//OnPickerNotifyKeyDownApps
374:
375: //*********************************************************
376: // OnPickerNotifyRightClick
377: //*********************************************************
378: static
379: LRESULT
380: OnPickerNotifyRightClick
381: (
382: HWND hWnd,
383: LPARAM _unuse( lParam )
384: )
385: {
386: // パラメタの仮定
387: ASSERT( IsValidWindow( hWnd ) );
388: ASSERT( IsValidPtr( (NMPICKER *)lParam, sizeof( NMPICKER ) ) );
389: ASSERT( IsWindowNotifyMessageParam( hWnd, lParam ) );
390: ASSERT( PCN_RCLICK == GetNotifyMessageNotifyCode( lParam ) );
391:
392: // 親へ PCN_CONTEXTMENU を通知
393: Picker_SendContextMenuMessage( hWnd );
394:
395: return 0L;
396: }//OnPickerNotifyRightClick
397:
398:
399: //******************************************************************************************************************
400: // message
401: //******************************************************************************************************************
402: //*********************************************************
403: // Picker_SendBeginDragMessage
404: // 親へD&Dの開始を通知
405: //*********************************************************
406: static
407: LRESULT
408: Picker_SendBeginDragMessage
409: (
410: HWND hWnd
411: )
412: {
413: // パラメタの仮定
414: ASSERT( IsValidWindow( hWnd ) );
415:
416: NMPICKER nmpc;
417: memzero( &nmpc, sizeof( nmpc ) );
418: VERIFY( MakeNotifyStruct( &nmpc.hdr, hWnd, PCN_BEGINDRAG ) );
419: HWND hParent = GetParent( hWnd );
420: return SendMessage
421: (
422: hParent,
423: WM_NOTIFY,
424: nmpc.hdr.idFrom,
425: reinterpret_cast<LPARAM>( &nmpc )
426: );
427: }//Picker_SendBeginDragMessage
428:
429: //*********************************************************
430: // Picker_SendEndDragMessage
431: // 親へD&Dの終了を通知
432: //*********************************************************
433: static
434: LRESULT
435: Picker_SendEndDragMessage
436: (
437: HWND hWnd
438: )
439: {
440: // パラメタの仮定
441: ASSERT( IsValidWindow( hWnd ) );
442:
443: NMPICKER nmpc;
444: memzero( &nmpc, sizeof( nmpc ) );
445: VERIFY( MakeNotifyStruct( &nmpc.hdr, hWnd, PCN_ENDDRAG ) );
446: HWND hParent = GetParent( hWnd );
447: return SendMessage
448: (
449: hParent,
450: WM_NOTIFY,
451: nmpc.hdr.idFrom,
452: reinterpret_cast<LPARAM>( &nmpc )
453: );
454: }//Picker_SendEndDragMessage
455:
456: //*********************************************************
457: // Picker_SendMouseMoveMessage
458: // 親へ WM_MOUSEMOVE を通知
459: //*********************************************************
460: static
461: LRESULT
462: Picker_SendMouseMoveMessage
463: (
464: HWND hWnd,
465: WPARAM wParam,
466: LPARAM lParam
467: )
468: {
469: // パラメタの仮定
470: ASSERT( IsValidWindow( hWnd ) );
471:
472: NMPICKER nmpc;
473: memzero( &nmpc, sizeof( nmpc ) );
474: VERIFY( MakeNotifyStruct( &nmpc.hdr, hWnd, PCN_MOUSEMOVE ) );
475: nmpc.wParam = wParam;
476: nmpc.lParam = lParam;
477: HWND hParent = GetParent( hWnd );
478: return SendMessage
479: (
480: hParent,
481: WM_NOTIFY,
482: nmpc.hdr.idFrom,
483: reinterpret_cast<LPARAM>( &nmpc )
484: );
485: }//Picker_SendMouseMoveMessage
486:
487: //*********************************************************
488: // Picker_SendDroppedMessage
489: // 親へドロップを通知
490: //*********************************************************
491: static
492: LRESULT
493: Picker_SendDroppedMessage
494: (
495: HWND hWnd
496: )
497: {
498: // パラメタの仮定
499: ASSERT( IsValidWindow( hWnd ) );
500:
501: NMPICKER nmpc;
502: memzero( &nmpc, sizeof( nmpc ) );
503: VERIFY( MakeNotifyStruct( &nmpc.hdr, hWnd, PCN_DROPPED ) );
504: //
505: HWND hParent = GetParent( hWnd );
506: return SendMessage
507: (
508: hParent,
509: WM_NOTIFY,
510: nmpc.hdr.idFrom,
511: reinterpret_cast<LPARAM>( &nmpc )
512: );
513: }//Picker_SendDroppedMessage
514:
515: //*********************************************************
516: // Picker_SendContextMenuMessage
517: // 親へ WM_CONTEXTMENU を通知
518: //*********************************************************
519: static
520: LRESULT
521: Picker_SendContextMenuMessage
522: (
523: HWND hWnd
524: )
525: {
526: // パラメタの仮定
527: ASSERT( IsValidWindow( hWnd ) );
528:
529: NMPICKER nmpc;
530: memzero( &nmpc, sizeof( nmpc ) );
531: VERIFY( MakeNotifyStruct( &nmpc.hdr, hWnd, PCN_CONTEXTMENU ) );
532: HWND hParent = GetParent( hWnd );
533: return SendMessage
534: (
535: hParent,
536: WM_NOTIFY,
537: nmpc.hdr.idFrom,
538: reinterpret_cast<LPARAM>( &nmpc )
539: );
540: }//Picker_SendContextMenuMessage
541:
542: //*********************************************************
543: // Picker_SendRightClickMessage
544: // 親へ右クリックを通知
545: //*********************************************************
546: static
547: LRESULT
548: Picker_SendRightClickMessage
549: (
550: HWND hWnd
551: )
552: {
553: // パラメタの仮定
554: ASSERT( IsValidWindow( hWnd ) );
555:
556: NMPICKER nmpc;
557: memzero( &nmpc, sizeof( nmpc ) );
558: VERIFY( MakeNotifyStruct( &nmpc.hdr, hWnd, PCN_RCLICK ) );
559: HWND hParent = GetParent( hWnd );
560: return SendMessage
561: (
562: hParent,
563: WM_NOTIFY,
564: nmpc.hdr.idFrom,
565: reinterpret_cast<LPARAM>( &nmpc )
566: );
567: }//Picker_SendRightClickMessage
568:
569: //*********************************************************
570: // Picker_SendKeyDownMessage
571: // 親へ WM_KEYDOWN を通知
572: //*********************************************************
573: static
574: LRESULT
575: Picker_SendKeyDownMessage
576: (
577: HWND hWnd,
578: WPARAM wParam,
579: LPARAM lParam
580: )
581: {
582: // パラメタの仮定
583: ASSERT( IsValidWindow( hWnd ) );
584:
585: NMPICKER nmpc;
586: memzero( &nmpc, sizeof( nmpc ) );
587: VERIFY( MakeNotifyStruct( &nmpc.hdr, hWnd, PCN_KEYDOWN ) );
588: nmpc.wParam = wParam;
589: nmpc.lParam = lParam;
590: HWND hParent = GetParent( hWnd );
591: return SendMessage
592: (
593: hParent,
594: WM_NOTIFY,
595: nmpc.hdr.idFrom,
596: reinterpret_cast<LPARAM>( &nmpc )
597: );
598: }//Picker_SendKeyDownMessage
599:
600:
601: //******************************************************************************************************************
602: // util
603: //******************************************************************************************************************
604: //*********************************************************
605: // CallOriginalProc
606: //*********************************************************
607: static
608: LRESULT
609: CallOriginalProc
610: (
611: HWND hWnd,
612: UINT uMsg,
613: WPARAM wParam,
614: LPARAM lParam
615: )
616: {
617: // パラメタの仮定
618: ASSERT( IsValidWindow( hWnd ) );
619:
620: WNDPROC OriginalProc = (WNDPROC)GetProp( hWnd, PROP_ORIGINALPROC );
621: return CallWindowProc( OriginalProc, hWnd, uMsg, wParam, lParam );
622: }//CallOriginalProc
623:
624:
625: //** end **
参照:
水無瀬の部屋 > sample > tools > ctrl > picker > picker.cpp |
---|
このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/tools/ctrl/picker/picker_cpp.shtml