このサイトは2013/3/20に新しい名前になりました(ニックネーム変更のため)

2011年09月19日

ヘルプボックスの追加

<This page comes from "HSP素材館">
<This page's idea comes from Mr.k5342>
よく、ダイアログボックスとしてそのボタン類がどういう動作をするのか説明するために×ボタンの左に「?」マークがありますよね?今回はそれの付け方を。
まあ、先にソースを実行してみるのがいいかと。


その前に豆知識
「?」ボタンは最小化ボタンと最大化ボタンとは共存できません。
なので最小化・最大化をはずしてから「?」を付けましょう。


では手順。
(0)「?」ボタンの説明のために、何の動作もしないボタンを用意します。
(1)最小化・最大化ボタンをはずす。
(2)「?」ボタンをつける
(3)「?」ボタン関連のメッセージを受け取り処理する


詳しい手順

(0)「?」ボタンの説明のために、何の動作もしないボタンを用意します。
まず、ボタンを用意してください。その際、このボタンのウィンドウハンドルが必要になるので取っておいてください。

(1)最小化・最大化ボタンをはずす。
最大化・最小化ボタンをはずすには、GetWindowLong関数を使ってウィンドウのウィンドウスタイルを取得してから、
その取得したウィンドウスタイルから最大化・最小化ボタン有無のスタイルをはずして、SetWindowLong関数で更新すればOKです。
GetWindowLong hwnd, -16;ウィンドウスタイルの取得(statに値が入る)
SetWindowLong hwnd, -16, stat-(stat&(WS_MAXIMIZEBOX|WS_MINIMIZEBOX));はずす(分かりにくくてすいません
注:-16はウィンドウスタイルの取得・変更です

(2)「?」ボタンをつける
「?」ボタンの有無は、ウィンドウの拡張ウィンドウスタイルで決まります。
(1)と同じように、拡張ウィンドウスタイルを取得し「?」ボタン有無のスタイルをつけ足せばOK。
GetWindowLong hwnd, -20
SetWindowLong hwnd, -20, stat^(WS_EX_CONTEXTHELP)
注:-20は拡張ウィンドウスタイルの取得・変更です

(3)「?」ボタン関連のメッセージを受け取り処理する
「?」ボタン関連の情報をWINDOWSが検知するとウィンドウにWM_HELPを送ります。
なのでHSPでは
oncmd goto*HELP,WM_HELP
のようにします。
また、*HELPでは、どのボタン類のヘルプを必要としているかを確認する必要があります。
確認するには、WM_JELPが送られてくるのと同時に、lparamにHELPINFO構造体へのポインタが格納されます。
このHELPINFO構造体を調べればどのボタン類が押されているか判断できます。
HELPINFO構造体の中身は、下のソースを見てわかるように、4番目のメンバにヘルプを必要としているボタン類のウィンドウハンドルが格納されています。
なので
dupptr hItemHandle,LPHELPINFO+4*3,4,vartype("int")
のようにすれば、どのボタン類が押されているかはんだするためのウィンドウハンドルを取得することができます。
そして最後に取っておいたボタン類のウィンドウハンドルとこの取得したウィンドウハンドルが等しいかどうか確認して、
同じであればそれに見合った動作をすればOKです。

<終わり>

ソース WINDOWS-HELP-v2.2.hsp

;typedef  struct  tagHELPINFO { 
;    UINT     cbSize; 
;    int      iContextType 
;    int      iCtrlId; 
;    HANDLE   hItemHandle; 
;    DWORD    dwContextId; 
;    POINT    MousePos; 
;} HELPINFO, FAR *LPHELPINFO;

#include "user32.as"
#define WM_HELP 0x0053
#define WS_MINIMIZEBOX 0x00020000
#define WS_MAXIMIZEBOX 0x00010000;最初からついてないからいらない
#define WS_EX_CONTEXTHELP $00000400


objsize 200,100
button "ここにヘルプを合わせると…",*NUL
HBTN1= objinfo(stat,2)


GetWindowLong hwnd, -16
SetWindowLong hwnd, -16, stat^(WS_MINIMIZEBOX)
GetWindowLong hwnd, -20
SetWindowLong hwnd, -20, stat^(WS_EX_CONTEXTHELP|1)
redraw 1;更新

oncmd goto*HELP,WM_HELP

stop

*HELP
LPHELPINFO=lparam
dupptr hItemHandle,LPHELPINFO+4*3,4,vartype("int")
if hItemHandle=HBTN1{dialog "このボタンのヘルプは別にどうってことはない",0,"SYSTEM MESSAGE"}
stop

*NUL
stop




posted by ? at 11:08| Comment(0) | WINAPIメモ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。