[PR]

水無瀬の部屋 > Programming > sample > sendsend > parambox.cpp
最終更新日: 2007/10/23

   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: 

参照:


Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬の部屋 > sample > sendsend > parambox.cpp

このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/sendsend/parambox_cpp.shtml
『新妻LOVELY×CATION』を応援しています!