INTERNATIONAL LABORATORY CORPORATION


サポート > GENWARE3 サポート > 技術情報(よくあるご質問と回答) >

ボタンクリック時の共通処理を行う方法

組込みGUI統合開発環境 GENWARE3(ジェンウェアスリー) サポート

技術情報(よくあるご質問と回答)

ご質問

すべての画面上でボタンクリック時に共通処理を実現する方法を教えてください。

回答

スクリーンのコールバック関数PrePressとボタン検索関数を作成することで、すべての画面上のボタンクリック時に共通の処理を実現することができます。 実現手順とサンプルコードを下記に記載いたします。

コールバック関数PrePress内では、ボタンがクリックされたかどうかを判断し、クリックされている場合、共通処理を実施します。

■ 実現手順

  1. GENSKETCH3の[設定]-[スクリーンプロパティ]を選択します。
  2. スクリーンプロパティの「PrePress」を「あり」にします。
  3. ソースコード生成を行います。
  4. 生成したG「プロジェクト名」Screen.c/cxxのインクルード部分にサンプルコード1を記載してください。
  5. サンプルコード2をG「プロジェクト名」Screen.c/cxxのPrePressコールバック関数内に記載してください。
  6. サンプルコード3をG「プロジェクト名」Screen.c/cxxに記載してください。

【C言語用サンプルコード】
■    サンプルコード1(G「プロジェクト名」Screen.cのインクルード部分に記載します。)
#include "GSVFrame.h"
long CheckButtonPress( GPanel *pPanel, GPoint gptPoint, short nVFrame );

■    サンプルコード2(G「プロジェクト名」Screen.cのPrePressコールバック関数内に記載します。)
    GPanel *pPanel;
    long    nRet;

    /* パネルオブジェクトを取得 */
    pPanel = (GPanel *)GWGetVmt(GScreen_VMT, GWGetScreen())->GetPanel(GWGetScreen());

    /* ボタンがプレスされているかチェックする */
    nRet = CheckButtonPress( pPanel, gptPoint, FALSE );

    /* ボタンが押下されたか? */
    if( nRet ){
        /* ユーザーコード記載*/
        /*ここに共通処理を記載する。*/

}

■    サンプルコード3(G「プロジェクト名」Screen.cの最後にパネル内ボタン検索関数を作成します。)
//===========================================================
/* パネル内ボタン検索関数

    戻り値がTRUEならばプレス位置にボタンあり
    戻り値がFALSEならばプレス位置にボタンなし

    pPanel : 表示パネル
    gptPoint : プレス座標
    nVFrame : ビューフレーム確認フラグ
*/

//===========================================================
long CheckButtonPress( GPanel *pPanel, GPoint gptPoint, short nVFrame )
{
void            *pvItem;
GScreen            *pScreen = GWGetScreen();
GFrame            *pFrame;
GBaseWindow        *pChild;
GBaseWindowList *pWindowList;
GBaseWindow        *pWindow;
GPanel            *pPanelBuf = pPanel;
GPanel            *pVFPanel;
GRect            grChild;
GPoint            gptVFPoint;
long            lRet = FALSE;

/* ビューフレームかどうかチェックする */
if( nVFrame != TRUE ){ 
/*    
 *    ウィンドウ内を検索する
 */


/* ウィンドウリストを取得            */
pFrame = GWGetVmt(GScreen_VMT, pScreen)->GetFrame(pScreen);
pWindowList = GWGetVmt(GFrame_VMT, pFrame)->GetChildList(pFrame);
/* ウィンドウリスト検索                */
pvItem = FindLastItemGBaseWindowList(pWindowList);
if(pvItem != NULL) {
    while((pvItem = FindPrevItemGBaseWindowList(pWindowList, pvItem, &pWindow)) != NULL) {
    /* ウィンドウ用に座標を再計算する*/
GPTOffsetPoint( &gptPoint, (short)-GWGetVmt( GBaseWindow_VMT, pWindow)->GetXPosition( pWindow ), (short)-GWGetVmt( GBaseWindow_VMT, pWindow)->GetYPosition( pWindow ) );
    pWindow = (GBaseWindow *)GWGetVmt( GWindow_VMT, pWindow )->GetPanel( (GWindow *)pWindow );
/* 開いているウィンドウを取得 */
pPanelBuf = (GPanel *)pWindow;
break;
 }
 }
}
/*    
*    パネル内を検索する
*/


/* リストの検索位置を初期化 */
pvItem = FindLastItemGBaseWindowList( &(pPanelBuf->pChildList) );
if(pvItem != NULL) {
/* コントロールリストの検索を行い座標上にあるコントロールを特定する */
while( (pvItem = FindPrevItemGBaseWindowList( &(pPanelBuf->pChildList), pvItem, &pChild )) != NULL ){
GWGetVmt( GBaseWindow_VMT, pChild)->GetBounds( pChild, &grChild );
/* 座標がオブジェクトの外周矩形内か確認 */
if( GRPointInRect( &gptPoint, &grChild ) == FALSE ){
    continue;
}
/* オブジェクトが有効か確認 */
if( GWGetVmt( GBaseWindow_VMT, pChild)->GetEnableStatus( pChild ) == TRUE ){
                
/* オブジェクトがボタンか? */
if( pChild->usType == GBUTTON ){
    /* プレス範囲内に、入力可能ボタンオブジェクトが存在する */
    lRet = TRUE;
    /* オブジェクトがビューフレームか? */
    }else if0x6000 <= pChild->usType && pChild->usType <= 0x7FFF ){

/* ビューフレームの場合は、ビューフレーム内のパネルも検索する */
pVFPanel = (GPanel *)GWGetVmt( GSVFrame_VMT, pChild)->GetActiveChild( pChild );
/* ビューフレーム用に座標を再計算する*/
gptVFPoint = gptPoint;
GPTOffsetPoint( &gptVFPoint, (short)-GWGetVmt( GBaseWindow_VMT, pChild)->GetXPosition( pChild ), (short)-GWGetVmt( GBaseWindow_VMT, pChild)->GetYPosition( pChild ) );
/* ボタンがプレスされているかチェックする */
lRet = CheckButtonPress( pVFPanel, gptVFPoint, TRUE );
    }
}

if( lRet == TRUE ){
    /* 検索終了 */
    break;
    }
    }
}
    return lRet;
}


【C++言語用サンプルコード】
■    サンプルコード1
#include "GCSVFrame.hpp"
long CheckButtonPress( GCPanel *pPanel, GPoint gptPoint, short nVFrame );

■    サンプルコード2
GCPanel *pPanel;
    long    nRet;

    /* パネルオブジェクトを取得 */
    pPanel = GCWGetScreen()->GetPanel();

    /* ボタンがプレスされているかチェックする */
    nRet = CheckButtonPress( pPanel, gptPoint, FALSE );

    /* ボタンが押下されたか? */
    if( nRet ){
        /* ユーザーコード記載*/
        /*ここに共通処理を記載する。*/
    }


■    サンプルコード3
//===========================================================
/* パネル内ボタン検索関数

    戻り値がTRUEならばプレス位置にボタンあり
    戻り値がFALSEならばプレス位置にボタンなし

    pPanel : 表示パネル
    gptPoint : プレス座標
    nVFrame : ビューフレーム確認フラグ
*/

//===========================================================
long CheckButtonPress( GCPanel *pPanel, GPoint gptPoint, short nVFrame )
{
GCScreen        *pScreen = GCWGetScreen();
GCFrame            *pFrame;
GCBaseWindow        *pChild;
GCBaseWindowList     *pWindowList;
GCBaseWindow        *pWindow;
GCPanel            *pPanelBuf = pPanel;
GCPanel            *pVFPanel;
GRect            grChild;
GPoint            gptVFPoint;
long            lRet = FALSE;
    
/* ビューフレームかどうかチェックする */
if( nVFrame != TRUE ){ 

/*    
 *    ウィンドウ内を検索する
 */


/* ウィンドウリストを取得            */
pFrame=pScreen->GetFrame();
pWindowList=pFrame->GetChildList();
        
        
/* ウィンドウリスト検索                */
if(pWindowList->FindLastItem()) {
    while(pWindowList->FindPrevItem(&pWindow)) {
    /* ウィンドウ用に座標を再計算する*/
    GPTOffsetPoint( &gptPoint, (short)-pWindow->GetXPosition(), (short)-pWindow->GetYPosition() );
    pWindow = ((GCWindow *)pWindow)->GetPanel();
            
    /* 開いているウィンドウを取得 */
    pPanelBuf = (GCPanel *)pWindow;
    break;
        }
}
}

/*    
 *    パネル内を検索する
 */


/* リストの検索位置を初期化 */
pWindowList = pPanelBuf->GetChildList();

if(pWindowList->FindLastItem()) {
    /* コントロールリストの検索を行い座標上にあるコントロールを特定する */
    while(pWindowList->FindPrevItem(&pChild)) {
        pChild->GetBounds(&grChild);
        /* 座標がオブジェクトの外周矩形内か確認 */
        if( GRPointInRect( &gptPoint, &grChild ) == FALSE ){
        continue;
        }
    /* オブジェクトが有効か確認 */
    if( pChild->GetEnableStatus() == TRUE ){

    /* オブジェクトがボタンか? */
    if( pChild->GetType() == GBUTTON ){
/* プレス範囲内に、入力可能ボタンオブジェクトが存在する */
    lRet = TRUE;

    /* オブジェクトがビューフレームか? */
    }else if0x6000 <= pChild->GetType() && pChild->GetType() <= 0x7FFF ){

    /* ビューフレームの場合は、ビューフレーム内のパネルも検索する */
    pVFPanel=(GCPanel *)((GCPanel *)pChild)->GetActiveChild();
    /* ビューフレーム用に座標を再計算する*/
    gptVFPoint = gptPoint;
    GPTOffsetPoint( &gptVFPoint, (short)-pChild->GetXPosition(), (short)-pChild->GetYPosition());
    /* ボタンがプレスされているかチェックする */
    lRet = CheckButtonPress( pVFPanel, gptVFPoint, TRUE );
        }
    }

    if( lRet == TRUE ){
    /* 検索終了 */
    break;
        }
}
}

return lRet;


 

対象製品バージョン:Ver.2.00.000

管理番号:FG_G10086

資料更新日: 2009年2月26日

※この資料は、資料更新日現在のものです。


ページTOPへ

ILC商品一覧