水無瀬の部屋 > Programming > sample > sendsend > parambox.cpp |
---|
1: //*********************************************************
2: // プロジェクト: Send to 'SendTo'
3: // ファイル名: parambox.cpp
4: //*********************************************************
5: #include "parambox.h"
6: #include "sendsend.h"
7: #include "mkcmdln.h"
8: #include "res.h"
9:
10:
11: //---------------------------------------------------------
12: // マクロ の 定義
13: //---------------------------------------------------------
14: #define PROP_DIALOGPARAM "PROP_DIALOGPARAM"
15: #define FLAG_NOTOPEN ( (DWORD)BIT( 2 ) )
16: #define FLAG_NOEXT ( (DWORD)BIT( 1 ) )
17: #define FLAG_PATH ( (DWORD)BIT( 0 ) )
18:
19:
20: //---------------------------------------------------------
21: // ファイルスコープ関数 の 宣言
22: //---------------------------------------------------------
23: static INT_PTR UpdateDialogState( HWND hWnd );
24: static INT_PTR CALLBACK ParamBoxProc( HWND, UINT, WPARAM, LPARAM );
25:
26:
27: //---------------------------------------------------------
28: // ファイルスコープ変数 の 定義
29: //---------------------------------------------------------
30: static SIZE g_szClient;
31: static SIZE g_szMinWindow;
32:
33:
34: //*********************************************************
35: // ParamBox
36: //*********************************************************
37: bool
38: ParamBox
39: (
40: HWND hWnd,
41: INSTALLINFO_t *info
42: )
43: {
44: // パラメタの仮定
45: ASSERT( !hWnd || IsValidWindow( hWnd ) );
46: ASSERT( IsValidPtr( info, sizeof( *info ) ) );
47: ASSERT( IsValidStringPtr( info->cmdline ) );
48: ASSERT( IsValidStringPtr( info->regpath ) );
49: ASSERT( IsValidStringPtr( info->menu ) );
50:
51: HINSTANCE hInstance = GetModuleHandle( null );
52: return IDOK == DialogBoxPtrParam
53: (
54: hInstance,
55: MAKEINTRESOURCE( PARAM_BOX ),
56: hWnd,
57: ParamBoxProc,
58: info
59: );
60: }//ParamBox
61:
62:
63: //******************************************************************************************************************
64: // private
65: //******************************************************************************************************************
66: static INT_PTR OnParamDestroy( HWND hWnd );
67: static INT_PTR OnParamSize( HWND hWnd, WPARAM wParam, LPARAM lParam );
68: static INT_PTR OnParamGetMinMaxInfo( HWND hWnd, LPARAM lParam );
69: static INT_PTR OnParamHitTest( HWND hWnd, WPARAM wParam, LPARAM lParam );
70: static INT_PTR OnParamInitDialog( HWND hWnd, LPARAM lParam );
71: static INT_PTR OnParamCommand( HWND hWnd, WPARAM wParam );
72:
73:
74: //*********************************************************
75: // ParamBoxProc
76: //*********************************************************
77: static
78: INT_PTR
79: CALLBACK
80: ParamBoxProc
81: (
82: HWND hWnd,
83: UINT uMsg,
84: WPARAM wParam,
85: LPARAM lParam
86: )
87: {
88: // パラメタの仮定
89: ASSERT( IsValidWindow( hWnd ) );
90:
91: switch( uMsg )
92: {
93: case WM_DESTROY: return OnParamDestroy( hWnd );
94: case WM_SIZE: return OnParamSize( hWnd, wParam, lParam );
95: case WM_GETMINMAXINFO: return OnParamGetMinMaxInfo( hWnd, lParam );
96: case WM_NCHITTEST: return OnParamHitTest( hWnd, wParam, lParam );
97: case WM_INITDIALOG: return OnParamInitDialog( hWnd, lParam );
98: case WM_COMMAND: return OnParamCommand( hWnd, wParam );
99: default: return false;
100: }
101: }//ParamBoxProc
102:
103: //*********************************************************
104: // OnParamDestroy
105: //*********************************************************
106: static
107: INT_PTR
108: OnParamDestroy
109: (
110: HWND hWnd
111: )
112: {
113: // パラメタの仮定
114: ASSERT( IsValidWindow( hWnd ) );
115:
116: VERIFY( RemoveProp( hWnd, PROP_DIALOGPARAM ) );
117:
118: return true;
119: }//OnParamDestroy
120:
121: //*********************************************************
122: // OnParamSize
123: //*********************************************************
124: static
125: INT_PTR
126: OnParamSize
127: (
128: HWND hWnd,
129: WPARAM wParam,
130: LPARAM lParam
131: )
132: {
133: // パラメタの仮定
134: ASSERT( IsValidWindow( hWnd ) );
135:
136: if ( SIZE_MINIMIZED == wParam )
137: {
138: return true;
139: }
140:
141: static const struct
142: {
143: int nID;
144: bool bPosX;
145: bool bPosY;
146: bool bSizeX;
147: bool bSizeY;
148: }
149: ctl[] =
150: {
151: { IDOK, true, false, false, false },
152: { IDCANCEL, true, false, false, false },
153: { IDC_REGPATH, false, false, true, false },
154: { IDC_CMDLINE, false, false, true, false },
155: };
156: HDWP hdwp = BeginDeferWindowPos( numof(ctl) );
157: if ( hdwp )
158: {
159: const int width = LOWORD(lParam);
160: const int height = HIWORD(lParam);
161: const int nShiftX = width - g_szClient.cx;
162: const int nShiftY = height - g_szClient.cy;
163: {for( int i = 0; i < numof( ctl ); ++i )
164: {
165: VERIFY( ShiftDeferDlgItem
166: (
167: &hdwp,
168: hWnd,
169: ctl[ i ].nID,
170: ctl[ i ].bPosX ? nShiftX : 0,
171: ctl[ i ].bPosY ? nShiftY : 0,
172: ctl[ i ].bSizeX ? nShiftX : 0,
173: ctl[ i ].bSizeY ? nShiftY : 0
174: ) );
175: }}
176: VERIFY( EndDeferWindowPos( hdwp ) );
177:
178: g_szClient.cx = width;
179: g_szClient.cy = height;
180: }
181:
182: return true;
183: }//OnParamSize
184:
185: //*********************************************************
186: // OnParamGetMinMaxInfo
187: //*********************************************************
188: static
189: INT_PTR
190: OnParamGetMinMaxInfo
191: (
192: HWND hWnd,
193: LPARAM lParam
194: )
195: {
196: // パラメタの仮定
197: ASSERT( IsValidWindow( hWnd ) );
198: ASSERT( IsValidPtr( (MINMAXINFO *)lParam, sizeof(MINMAXINFO) ) );
199:
200: MINMAXINFO *pmmi = reinterpret_cast<MINMAXINFO *>( lParam );
201: pmmi->ptMinTrackSize.y = g_szMinWindow.cy; //
202: pmmi->ptMaxTrackSize.y = g_szMinWindow.cy; // y 方向はサイズ固定
203: pmmi->ptMinTrackSize.x = g_szMinWindow.cx; //3 * GetWindowWidth( GetDlgItem(hWnd, IDOK) ); //
204:
205: return true;
206: }//OnParamGetMinMaxInfo
207:
208: //*********************************************************
209: // OnParamHitTest
210: //*********************************************************
211: static
212: INT_PTR
213: OnParamHitTest
214: (
215: HWND hWnd,
216: WPARAM wParam,
217: LPARAM lParam
218: )
219: {
220: // パラメタの仮定
221: ASSERT( IsValidWindow( hWnd ) );
222:
223: // サイズ変更矢印の変換ルール一覧
224: const struct { LRESULT from; LRESULT to; } trans[] =
225: {
226: { HTCLIENT, HTCAPTION }, // クライアント領域を掴んで移動可能に
227: { HTTOP, HTBORDER }, // 上端の上下矢印 → 矢印なし
228: { HTBOTTOM, HTBORDER }, // 下端の上下矢印 → 矢印なし
229: { HTTOPLEFT, HTLEFT }, // 左上隅の斜め矢印 → 横矢印
230: { HTTOPRIGHT, HTRIGHT }, // 右上隅の斜め矢印 → 横矢印
231: { HTBOTTOMLEFT, HTLEFT }, // 左下隅の斜め矢印 → 横矢印
232: { HTBOTTOMRIGHT, HTRIGHT }, // 右下隅の斜め矢印 → 横矢印
233: };
234: // 変換一覧にあれば変換した値を返す
235: const LRESULT lResult = DefWindowProc( hWnd, WM_NCHITTEST, wParam, lParam );
236: {for( int i = 0; i < numof(trans); ++i )
237: {
238: if ( lResult == trans[ i ].from )
239: {
240: SetWindowLongPtr64( hWnd, DWL_MSGRESULT, trans[ i ].to );
241: return true;
242: }
243: }}
244:
245: return false;
246: }//OnParamHitTest
247:
248: //*********************************************************
249: // OnParamInitDialog
250: //*********************************************************
251: static
252: INT_PTR
253: OnParamInitDialog
254: (
255: HWND hWnd,
256: LPARAM lParam
257: )
258: {
259: // パラメタの仮定
260: ASSERT( IsValidWindow( hWnd ) );
261: ASSERT( IsValidPtr( (INSTALLINFO_t *)lParam, sizeof(INSTALLINFO_t) ) );
262: ASSERT( IsValidStringPtr( ((INSTALLINFO_t *)lParam)->cmdline ) );
263: ASSERT( IsValidStringPtr( ((INSTALLINFO_t *)lParam)->regpath ) );
264: ASSERT( IsValidStringPtr( ((INSTALLINFO_t *)lParam)->menu ) );
265:
266: // ダイアログの初期化
267: INSTALLINFO_t *info = (INSTALLINFO_t *)lParam;
268: VERIFY( SetProp( hWnd, PROP_DIALOGPARAM, info ) );
269: VERIFY( GetWindowSize( hWnd, &g_szMinWindow ) );
270: VERIFY( GetClientSize( hWnd, &g_szClient ) );
271: VERIFY( WindowMoveToCursorPos( hWnd ) );
272:
273: // コントロールの初期化
274: SetDlgItemText( hWnd, IDC_REGPATH, info->regpath );
275: SetDlgItemText( hWnd, IDC_CMDLINE, info->cmdline );
276:
277: return true;
278: }//OnParamInitDialog
279:
280:
281: //******************************************************************************************************************
282: // private - WM_COMMAND
283: //******************************************************************************************************************
284: static INT_PTR OnParamCommandOK( HWND hWnd );
285: static INT_PTR OnParamCommandCancel( HWND hWnd );
286: static INT_PTR OnParamCommandCommandLine( HWND hWnd, WPARAM wParam );
287: static INT_PTR OnParamCommandNoExtension( HWND hWnd );
288: static INT_PTR OnParamCommandNoOpen( HWND hWnd );
289: static INT_PTR OnParamCommandInputPath( HWND hWnd );
290: static INT_PTR OnParamCommandCommandLineChange( HWND hWnd );
291: static INT_PTR OnParamCommandCheck( HWND hWnd, int nID, const char *param );
292:
293:
294: //*********************************************************
295: // OnParamCommand
296: //*********************************************************
297: static
298: INT_PTR
299: OnParamCommand
300: (
301: HWND hWnd,
302: WPARAM wParam
303: )
304: {
305: // パラメタの仮定
306: ASSERT( IsValidWindow( hWnd ) );
307:
308: switch( LOWORD(wParam) )
309: {
310: case IDOK: return OnParamCommandOK( hWnd );
311: case IDCANCEL: return OnParamCommandCancel( hWnd );
312: case IDC_CMDLINE: return OnParamCommandCommandLine( hWnd, wParam );
313: case IDC_EXTZERO: return OnParamCommandNoExtension( hWnd );
314: case IDC_OPENZERO: return OnParamCommandNoOpen( hWnd );
315: case IDC_INPUTPATH: return OnParamCommandInputPath( hWnd );
316: default: return false;
317: }
318: }//OnParamCommand
319:
320: //*********************************************************
321: // OnParamCommandOK
322: //*********************************************************
323: static
324: INT_PTR
325: OnParamCommandOK
326: (
327: HWND hWnd
328: )
329: {
330: // パラメタの仮定
331: ASSERT( IsValidWindow( hWnd ) );
332:
333: //
334: INSTALLINFO_t *info = (INSTALLINFO_t *)GetProp( hWnd, PROP_DIALOGPARAM );
335: ASSERT( IsValidPtr( info, sizeof( *info ) ) );
336:
337: // 関連づけ
338: char *cmdline = AllocDlgItemText( hWnd, IDC_CMDLINE );
339: if ( cmdline )
340: {
341: free( info->cmdline );
342: info->cmdline = cmdline;
343: }
344:
345: //
346: VERIFY( EndDialog( hWnd, IDOK ) );
347:
348: return true;
349: }//OnParamCommandOK
350:
351: //*********************************************************
352: // OnParamCommandCancel
353: //*********************************************************
354: static
355: INT_PTR
356: OnParamCommandCancel
357: (
358: HWND hWnd
359: )
360: {
361: // パラメタの仮定
362: ASSERT( IsValidWindow( hWnd ) );
363:
364: VERIFY( EndDialog( hWnd, IDCANCEL ) );
365:
366: return true;
367: }//OnParamCommandCancel
368:
369: //*********************************************************
370: // OnParamCommandNoExtension
371: //*********************************************************
372: static
373: INT_PTR
374: OnParamCommandNoExtension
375: (
376: HWND hWnd
377: )
378: {
379: // パラメタの仮定
380: ASSERT( IsValidWindow( hWnd ) );
381:
382: return OnParamCommandCheck
383: (
384: hWnd,
385: IDC_EXTZERO,
386: PARAM_NOEXT
387: );
388: }//OnParamCommandNoExtension
389:
390: //*********************************************************
391: // OnParamCommandNoOpen
392: //*********************************************************
393: static
394: INT_PTR
395: OnParamCommandNoOpen
396: (
397: HWND hWnd
398: )
399: {
400: // パラメタの仮定
401: ASSERT( IsValidWindow( hWnd ) );
402:
403: return OnParamCommandCheck
404: (
405: hWnd,
406: IDC_OPENZERO,
407: PARAM_NOTOPEN
408: );
409: }//OnParamCommandNoOpen
410:
411: //*********************************************************
412: // OnParamCommandInputPath
413: //*********************************************************
414: static
415: INT_PTR
416: OnParamCommandInputPath
417: (
418: HWND hWnd
419: )
420: {
421: // パラメタの仮定
422: ASSERT( IsValidWindow( hWnd ) );
423:
424: return OnParamCommandCheck
425: (
426: hWnd,
427: IDC_INPUTPATH,
428: PARAM_PATH
429: );
430: }//OnParamCommandInputPath
431:
432: //*********************************************************
433: // OnParamCommandCommandLine
434: //*********************************************************
435: static
436: INT_PTR
437: OnParamCommandCommandLine
438: (
439: HWND hWnd,
440: WPARAM wParam
441: )
442: {
443: // パラメタの仮定
444: ASSERT( IsValidWindow( hWnd ) );
445:
446: switch( HIWORD(wParam) )
447: {
448: case EN_CHANGE: return OnParamCommandCommandLineChange( hWnd );
449: default: return false;
450: }
451: }//OnParamCommandCommandLine
452:
453:
454: //******************************************************************************************************************
455: //
456: //******************************************************************************************************************
457: //*********************************************************
458: // OnParamCommandCheck
459: //*********************************************************
460: static
461: INT_PTR
462: OnParamCommandCheck
463: (
464: HWND hWnd,
465: int nID,
466: const char *param
467: )
468: {
469: // パラメタの仮定
470: ASSERT( IsValidWindow( hWnd ) );
471:
472: char *cmdline = AllocDlgItemText( hWnd, IDC_CMDLINE );
473: if ( cmdline )
474: {
475: char *str = null;
476: if ( BST_CHECKED == IsDlgButtonChecked( hWnd, nID ) )
477: {
478: str = commandline_replace_param( cmdline, param, null );
479: }
480: else if ( BST_UNCHECKED == IsDlgButtonChecked( hWnd, nID ) )
481: {
482: str = commandline_replace_param( cmdline, null, param );
483: }
484:
485: if ( str )
486: {
487: if ( !streqli( str, cmdline ) )
488: {
489: SetDlgItemText( hWnd, IDC_CMDLINE, str );
490: }
491: free( str );
492: }
493:
494: free( cmdline );
495: }
496:
497: return false;
498: }//OnParamCommandCheck
499:
500:
501: //******************************************************************************************************************
502: //
503: //******************************************************************************************************************
504:
505: static const struct
506: {
507: DWORD flag;
508: int nID;
509: const char *param;
510: }
511: g_pair[] =
512: {
513: { FLAG_NOTOPEN, IDC_OPENZERO, PARAM_NOTOPEN },
514: { FLAG_NOEXT, IDC_EXTZERO, PARAM_NOEXT },
515: { FLAG_PATH, IDC_INPUTPATH, PARAM_PATH },
516: };
517:
518:
519: //*********************************************************
520: // get_commandline_params
521: //*********************************************************
522: static
523: bool
524: get_commandline_params
525: (
526: const char *cmdline,
527: DWORD *flag
528: )
529: {
530: // パラメタの仮定
531: ASSERT( IsValidStringPtr( cmdline ) );
532:
533: int argc;
534: char **argv = argcargv( &argc, cmdline, FLG_ARGCARGV_MSDEFAULT );
535: if ( !argv )
536: {
537: return false;
538: }
539:
540: *flag = 0;
541:
542: {for( int i = 1; i < argc; ++i )
543: {
544: ASSERT( IsValidStringPtr( argv[ i ] ) );
545:
546: {for( int j = 0; j < numof( g_pair ); ++j )
547: {
548: if ( streqli( argv[ i ], g_pair[ j ].param ) )
549: {
550: *flag |= g_pair[ j ].flag;
551: }
552: }}
553: }}
554:
555: free_argcargv( argc, argv );
556: return true;
557: }//get_commandline_params
558:
559: //*********************************************************
560: // GetCommandLineCtrlFlags
561: //*********************************************************
562: static
563: bool
564: GetCommandLineCtrlFlags
565: (
566: HWND hWnd,
567: DWORD *flag
568: )
569: {
570: // パラメタの仮定
571: ASSERT( IsValidWindow( hWnd ) );
572:
573: //
574: char *cmdline = AllocDlgItemText( hWnd, IDC_CMDLINE );
575: if ( cmdline )
576: {
577: if ( get_commandline_params( cmdline, flag ) )
578: {
579: free( cmdline );
580: return true;
581: }
582: free( cmdline );
583: }
584: return false;
585: }//GetCommandLineCtrlFlags
586:
587: //*********************************************************
588: // OnParamCommandCommandLineChange
589: // コマンドラインが編集されたのでチェックボックスを更新する
590: //*********************************************************
591: static
592: INT_PTR
593: OnParamCommandCommandLineChange
594: (
595: HWND hWnd
596: )
597: {
598: // パラメタの仮定
599: ASSERT( IsValidWindow( hWnd ) );
600:
601: DWORD flag = 0;
602: if ( GetCommandLineCtrlFlags( hWnd, &flag ) )
603: {
604: {for( int j = 0; j < numof( g_pair ); ++j )
605: {
606: const UINT state = ( (0 != (flag & g_pair[ j ].flag)) ? BST_CHECKED : BST_UNCHECKED );
607: if ( state != IsDlgButtonChecked( hWnd, g_pair[ j ].nID ) )
608: {
609: CheckDlgButton( hWnd, g_pair[ j ].nID, state );
610: }
611: }}
612: }
613:
614: return false;
615: }//OnParamCommandCommandLineChange
616:
617:
618: //** end **
619:
参照:
水無瀬の部屋 > sample > sendsend > parambox.cpp |
---|
このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/sendsend/parambox_cpp.shtml