プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

[HSP]タスク・ダイアログのサンプル

2019年08月03日 00時28分00秒 | HSP講座

スクリプト言語の HSP については、公式ホームページの「HSPTV!」をどうぞ。


ここには、HSPで Windows Vista 以降で使える「タスク・ダイアログ」のサンプルを紹介します。
このタスク・ダイアログは、少々、複雑な設定を行う必要があるため1つの命令にして使いやすくします。
それでは、プロトタイプ宣言、構造体、サンプル・ソース、使い方の順に見ていきましょう。(戻る)

プロトタイプ宣言

HRESULT TaskDialogIndirect(
    const TASKDIALOGCONFIG  *pTaskConfig,
    int                     *pnButton,
    int                     *pnRadioButton,
    BOOL                    *pfVerificationFlagChecked
);

TASKDIALOGCONFIGの構造体

typedef struct _TASKDIALOGCONFIG {
    UINT                                cbSize;
    HWND                                hwndParent;
    HINSTANCE                           hInstance;
    TASKDIALOG_FLAGS                    dwFlags;
    TASKDIALOG_COMMON_BUTTON_FLAGS      dwCommonButtons;
    PCWSTR                              pszWindowTitle;
    union {
        HICON                           hMainIcon;
        PCWSTR                          pszMainIcon;
    } DUMMYUNIONNAME;
    PCWSTR                              pszMainInstruction;
    PCWSTR                              pszContent;
    UINT                                cButtons;
    const TASKDIALOG_BUTTON*            pButtons;
    int                                 nDefaultButton;
    UINT                                cRadioButtons;
    const TASKDIALOG_BUTTON*            pRadioButtons;
    int                                 nDefaultRadioButton;
    PCWSTR                              pszVerificationText;
    PCWSTR                              pszExpandedInformation;
    PCWSTR                              pszExpandedControlText;
    PCWSTR                              pszCollapsedControlText;
    union {
        HICON                           hFooterIcon;
        PCWSTR                          pszFooterIcon;
    } DUMMYUNIONNAME2;
    PCWSTR                              pszFooter;
    PFTASKDIALOGCALLBACK                pfCallback;
    LONG_PTR                            lpCallbackData;
    UINT                                cxWidth;
} TASKDIALOGCONFIG;

TASKDIALOG_BUTTONの構造体

typedef struct _TASKDIALOG_BUTTON {
    int         nButtonID;
    PCWSTR      pszButtonText;
} TASKDIALOG_BUTTON;

サンプル・ソース

管理上このサンプルは sample363(タスク・ダイアログ).hsp のソースです。

//------------------------------------------------------------------------------
// タスク・ダイアログ by 科学太郎
//==============================================================================
// 新規作成日:2019-08-02 (金) 18:40:00
// 最終更新日:2019-08-02 (金) 22:48:00
//------------------------------------------------------------------------------

//--------------------------------------
// Win32API関数の呼び出し定義
//--------------------------------------
#uselib "Comctl32.dll"
#func global TaskDialogIndirect         "TaskDialogIndirect"    sptr,sptr,sptr,sptr

//--------------------------------------
// 記号定数(API定数)
//--------------------------------------
#const global NULL                      $00000000
#const global IDOK                      1
#const global IDCANCEL                  2
#const global IDABORT                   3
#const global IDRETRY                   4
#const global IDIGNORE                  5
#const global IDYES                     6
#const global IDNO                      7

//--------------------------------------
// 記号定数(TASKDIALOGCONFIG)
//--------------------------------------
#;[ICON]
#const global TD_WARNING_ICON                       $0000FFFF   ;MAKEINTRESOURCEW(-1)
#const global TD_ERROR_ICON                         $0000FFFE   ;MAKEINTRESOURCEW(-2)
#const global TD_INFORMATION_ICON                   $0000FFFD   ;MAKEINTRESOURCEW(-3)
#const global TD_SHIELD_ICON                        $0000FFFC   ;MAKEINTRESOURCEW(-4)
#;[TASKDIALOG_FLAGS]
#const global TDF_ENABLE_HYPERLINKS                 $00000001
#const global TDF_USE_HICON_MAIN                    $00000002
#const global TDF_USE_HICON_FOOTER                  $00000004
#const global TDF_ALLOW_DIALOG_CANCELLATION         $00000008
#const global TDF_USE_COMMAND_LINKS                 $00000010
#const global TDF_USE_COMMAND_LINKS_NO_ICON         $00000020
#const global TDF_EXPAND_FOOTER_AREA                $00000040
#const global TDF_EXPANDED_BY_DEFAULT               $00000080
#const global TDF_VERIFICATION_FLAG_CHECKED         $00000100
#const global TDF_SHOW_PROGRESS_BAR                 $00000200
#const global TDF_SHOW_MARQUEE_PROGRESS_BAR         $00000400
#const global TDF_CALLBACK_TIMER                    $00000800
#const global TDF_POSITION_RELATIVE_TO_WINDOW       $00001000
#const global TDF_RTL_LAYOUT                        $00002000
#const global TDF_NO_DEFAULT_RADIO_BUTTON           $00004000
#const global TDF_CAN_BE_MINIMIZED                  $00008000
#const global TDIF_SIZE_TO_CONTENT                  $01000000
#const global TDF_SIZE_TO_CONTENT                   $01000000
#;[TASKDIALOG_COMMON_BUTTON_FLAGS]
#const global TDCBF_OK_BUTTON                       $00000001
#const global TDCBF_YES_BUTTON                      $00000002
#const global TDCBF_NO_BUTTON                       $00000004
#const global TDCBF_CANCEL_BUTTON                   $00000008
#const global TDCBF_RETRY_BUTTON                    $00000010
#const global TDCBF_CLOSE_BUTTON                    $00000020
#;[TASKDIALOG_NOTIFICATIONS]
#enum global TDN_CREATED=0
#enum global TDN_NAVIGATED
#enum global TDN_BUTTON_CLICKED
#enum global TDN_HYPERLINK_CLICKED
#enum global TDN_TIMER
#enum global TDN_DESTROYED
#enum global TDN_RADIO_BUTTON_CLICKED
#enum global TDN_DIALOG_CONSTRUCTED
#enum global TDN_VERIFICATION_CLICKED
#enum global TDN_HELP
#enum global TDN_EXPANDO_BUTTON_CLICKED
#;[TASKDIALOG_MESSAGES]
#enum global WM_USER=$400
#enum global TDM_NAVIGATE_PAGE=(WM_USER+101)            ;WM_USER+101
#enum global TDM_CLICK_BUTTON                           ;WM_USER+102
#enum global TDM_SET_MARQUEE_PROGRESS_BAR               ;WM_USER+103
#enum global TDM_SET_PROGRESS_BAR_STATE                 ;WM_USER+104
#enum global TDM_SET_PROGRESS_BAR_RANGE                 ;WM_USER+105
#enum global TDM_SET_PROGRESS_BAR_POS                   ;WM_USER+106
#enum global TDM_SET_PROGRESS_BAR_MARQUEE               ;WM_USER+107
#enum global TDM_SET_ELEMENT_TEXT                       ;WM_USER+108
#enum global TDM_                                       ;WM_USER+109
#enum global TDM_CLICK_RADIO_BUTTON                     ;WM_USER+110
#enum global TDM_ENABLE_BUTTON                          ;WM_USER+111
#enum global TDM_ENABLE_RADIO_BUTTON                    ;WM_USER+112
#enum global TDM_CLICK_VERIFICATION                     ;WM_USER+113
#enum global TDM_UPDATE_ELEMENT_TEXT                    ;WM_USER+114
#enum global TDM_SET_BUTTON_ELEVATION_REQUIRED_STATE    ;WM_USER+115
#enum global TDM_UPDATE_ICON                            ;WM_USER+116
#;[TASKDIALOG_ELEMENTS]
#enum global TDE_CONTENT=0
#enum global TDE_EXPANDED_INFORMATION
#enum global TDE_FOOTER
#enum global TDE_MAIN_INSTRUCTION
#;[TASKDIALOG_ICON_ELEMENTS]
#enum global TDIE_ICON_MAIN=0
#enum global TDIE_ICON_FOOTER

//--------------------------------------
// 列挙定数(TASKDIALOGCONFIG)
//--------------------------------------
#enum global tdc_cbSize=0                       ;UINT
#enum global tdc_hwndParent                     ;HWND
#enum global tdc_hInstance                      ;HINSTANCE
#enum global tdc_dwFlags                        ;TASKDIALOG_FLAGS
#enum global tdc_dwCommonButtons                ;TASKDIALOG_COMMON_BUTTON_FLAGS
#enum global tdc_pszWindowTitle                 ;PCWSTR
#enum global tdc_hMainIcon                      ;union:HICON
#enum global tdc_pszMainIcon=tdc_hMainIcon      ;union:PCWSTR
#enum global tdc_pszMainInstruction             ;PCWSTR
#enum global tdc_pszContent                     ;PCWSTR
#enum global tdc_cButtons                       ;UINT
#enum global tdc_pButtons                       ;const TASKDIALOG_BUTTON*
#enum global tdc_nDefaultButton                 ;int
#enum global tdc_cRadioButtons                  ;UINT
#enum global tdc_pRadioButtons                  ;const TASKDIALOG_BUTTON*
#enum global tdc_nDefaultRadioButton            ;int
#enum global tdc_pszVerificationText            ;PCWSTR
#enum global tdc_pszExpandedInformation         ;PCWSTR
#enum global tdc_pszExpandedControlText         ;PCWSTR
#enum global tdc_pszCollapsedControlText        ;PCWSTR
#enum global tdc_hFooterIcon                    ;union:HICON
#enum global tdc_pszFooterIcon=tdc_hFooterIcon  ;union:PCWSTR
#enum global tdc_pszFooter                      ;PCWSTR
#enum global tdc_pfCallback                     ;PFTASKDIALOGCALLBACK
#enum global tdc_lpCallbackData                 ;LONG_PTR
#enum global tdc_cxWidth                        ;UINT
#enum global DIM_TASKDIALOGCONFIG
#enum global SIZE_TASKDIALOGCONFIG=(DIM_TASKDIALOGCONFIG*4)

//--------------------------------------
// 列挙定数(TASKDIALOG_BUTTON)
//--------------------------------------
#enum global tdb_nButtonID=0            ;int
#enum global tdb_pszButtonText          ;PCWSTR
#enum global DIM_TASKDIALOG_BUTTON
#enum global SIZE_TASKDIALOG_BUTTON=(DIM_TASKDIALOG_BUTTON*4)

//--------------------------------------
// メイン部
//--------------------------------------
*Main
    screen 0,640,480,SCREEN_NORMAL|SCREEN_FIXEDSIZE
    syscolor 15:boxf:color:title "タスク・ダイアログ by 科学太郎"
    ;表示
    repeat 10
        title strf("タスク・ダイアログ by 科学太郎 (%d/10)",cnt+1)
        VistaDialog "タイトル","メイン","説明","フッタ",101,"項目01(&A)\n項目02(&B)\n項目03(&C)\n項目04(&D)\n項目05(&E)\n項目06(&F)",1,2
        switch(stat)
            ;選択枠
            case 101:           mes "「項目01」を選択しました。"        :swbreak
            case 102:           mes "「項目02」を選択しました。"        :swbreak
            case 103:           mes "「項目03」を選択しました。"        :swbreak
            case 104:           mes "「項目04」を選択しました。"        :swbreak
            case 105:           mes "「項目05」を選択しました。"        :swbreak
            case 106:           mes "「項目06」を選択しました。"        :swbreak
            ;その他
            case IDOK:          mes "「IDOK」が押されました。"          :swbreak
            case IDCANCEL:      mes "「IDCANCEL」が押されました。"      :swbreak
            case IDABORT:       mes "「IDABORT」が押されました。"       :swbreak
            case IDRETRY:       mes "「IDRETRY」が押されました。"       :swbreak
            case IDIGNORE:      mes "「IDIGNORE」が押されました。"      :swbreak
            case IDYES:         mes "「IDYES」が押されました。"         :swbreak
            case IDNO:          mes "「IDNO」が押されました。"          :swbreak
            ;エラー
            case -1:            mes "引数の選択枠エラーです。"          :swbreak
            case -2:            mes "引数のサイズエラーです。"          :swbreak
            default:            mes strf("何らかのエラーでタスク・ダイアログを表示できません。(Code:%d)",stat)
        swend
    loop
    mes ""
    mes "サンプルは終了しました。"
    stop
//--------------------------------------
// タスク・ダイアログの表示
//--------------------------------------
#deffunc VistaDialog str _title_,str _main_,str _text_,str _foot_,int _id_,str _item_,int _icon1_,int _icon2_,\
    local s0,local s1,local s2,local s3,local s4,\
    local p0,local p1,local p2,local p3,local p4,\
    local cSelect,local nLen,\
    local pSelect,local nMax,\
    local wSelect,local nResult,\
    local config
    ;行分割
    p0=(_id_)
    s0=(_item_)
    split s0,"\n",s0:cSelect=stat
    if(stat==0):return -1               ;選択枠のエラー
    ;最大桁
    nMax=0
    repeat cSelect
        nLen=strlen(s0.cnt)
        if(nLen>nMax):nMax=nLen
        if(nLen==0):cSelect=cnt:break
    loop
    if(nMax==0):return -2               ;サイズのエラー
    ;選択枠
    sdim wSelect,(nMax*2+2),cSelect
    dim  pSelect,2,cSelect
    repeat cSelect
        cnvstow wSelect(cnt),s0(cnt)
        pSelect(0,cnt)=p0
        pSelect(1,cnt)=varptr(wSelect.cnt)
        p0++
    loop
    ;ユニコード
    p1=ConvToUnicode(s1,_title_)        ;タイトル文字列
    p2=ConvToUnicode(s2,_main_)         ;メインのメッセージ
    p3=ConvToUnicode(s3,_text_)         ;ガイドのメッセージ
    p4=ConvToUnicode(s4,_foot_)         ;フッタのメッセージ
    ;構造体
    dim config,DIM_TASKDIALOGCONFIG
    config.tdc_cbSize                   =SIZE_TASKDIALOGCONFIG
    config.tdc_hwndParent               =hWnd
    config.tdc_hInstance                =hInstance
    config.tdc_dwFlags                  =(TDF_ALLOW_DIALOG_CANCELLATION|TDF_USE_COMMAND_LINKS|TDF_ENABLE_HYPERLINKS)
    config.tdc_dwCommonButtons          =0                      ;使う場合(TDCBF_xxx)
    config.tdc_pszWindowTitle           =p1                     ;タイトル文字列
    config.tdc_hMainIcon                =GetIconID(_icon1_)     ;メインのアイコンID
    config.tdc_pszMainInstruction       =p2                     ;メインのメッセージ
    config.tdc_pszContent               =p3                     ;ガイドのメッセージ
    config.tdc_cButtons                 =cSelect                ;使う場合(個数)
    config.tdc_pButtons                 =varptr(pSelect)        ;使う場合(TASKDIALOG_BUTTON[])
    config.tdc_nDefaultButton           =0                      ;使う場合(IDOK~IDNO)
    config.tdc_cRadioButtons            =0                      ;使う場合(個数)
    config.tdc_pRadioButtons            =NULL                   ;使う場合(TASKDIALOG_BUTTON[])
    config.tdc_nDefaultRadioButton      =0                      ;使う場合(IDOK~IDNO)
    config.tdc_pszVerificationText      =NULL                   ;使う場合(PCWSTR)
    config.tdc_pszExpandedInformation   =NULL                   ;使う場合(PCWSTR)
    config.tdc_pszExpandedControlText   =NULL                   ;使う場合(PCWSTR)
    config.tdc_pszCollapsedControlText  =NULL                   ;使う場合(PCWSTR)
    config.tdc_hFooterIcon              =GetIconID(_icon2_)     ;フッタのアイコンID
    config.tdc_pszFooter                =p4                     ;フッタのメッセージ
    config.tdc_pfCallback               =NULL                   ;コールバック関数(関数ポインタ)
    config.tdc_lpCallbackData           =NULL                   ;コールバック関数(データ)
    config.tdc_cxWidth                  =0                      ;ダイアログの横幅(0=自動調節)
    ;表示
    nResult=0
    TaskDialogIndirect varptr(config),varptr(nResult),NULL,NULL
    if(stat):return stat                ;エラー番号
    return nResult                      ;選択ID番号
//--------------------------------------
// 文字列をユニコードに変換
//--------------------------------------
#defcfunc ConvToUnicode var _s_,str _msg_
    if(_msg_)=="":return NULL
    ;初期化
    sdim(_s_),strlen(_msg_)*2+2
    ;変換
    cnvstow(_s_),(_msg_)
    return varptr(_s_)
//--------------------------------------
// アイコンIDの取得
//--------------------------------------
#defcfunc GetIconID int _icon_
    if(_icon_)==0:return NULL
    if(_icon_)==1:return TD_WARNING_ICON
    if(_icon_)==2:return TD_ERROR_ICON
    if(_icon_)==3:return TD_INFORMATION_ICON
    if(_icon_)==4:return TD_SHIELD_ICON
    return(_icon_)
//------------------------------------------------------------------------------
// End of sample363.hsp
//------------------------------------------------------------------------------

使い方

  1. タイトルの文字列
  2. メインのメッセージ
  3. ガイドのメッセージ
  4. フッタのメッセージ
  5. 選択項目の識別ID
  6. 選択項目の文字列
  7. メインのアイコン
  8. フッタのアイコン

上記の8つの引数を独自の「VistaDialog」命令に渡すと、次のようなタスク・ダイアログが表示されます。

このような拡張ダイヤログで簡単なヘルプ画面を出すことが可能です。

参考文献



コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« [HSP]キッチンタイマー - h... | トップ |   
最新の画像もっと見る

コメントを投稿

HSP講座」カテゴリの最新記事