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

2011年09月24日

サブメニューの作成

<メニューの作成を見ていないかたはそちらを先にご覧ください。>


[メニューの作成]では、ウィンドウにメニューをつけることができました。
ですが、メニューにはもう一種類あります。それは、サブメニューと呼ばれるものです。
サブメニューとは、メニューを押したときにそのメニューの下に出てくる下層のメニューのことです。
(下のスクリプトを実行して確かめてください。)
では説明していきます。


@Create


<Menu2.hsp>
#include "user32.as"//関数を使うためのソースを結合
#define ctype LOWORD(%1) (%1 & $FFFF)//下位ワード取得マクロ

oncmd gosub *command, $111//コマンド処理

#enum ID_MENU1 = 1//メニュー用ID列挙
#enum ID_MENU2
#enum ID_CH1_1
#enum ID_CH1_2
#enum ID_CH1_3
#enum ID_CH2_1
#enum ID_CH2_2
#enum ID_CH2_3

  alloc HMI,48//MENUITEMINFO構造体の準備
  lpoke HMI,4*0,48
  

CreatePopupMenu: Hch1=stat
  
  Name="AAA"
  lpoke HMI,4*1,0x00000002|0x00000010
  lpoke HMI,4*4,ID_CH1_1
  lpoke HMI,4*9,varptr(Name)
  InsertMenuItem Hch1 , ID_CH1_1 , 0, varptr(HMI)
  
  Name="BBB"
  lpoke HMI,4*1,0x00000002|0x00000010
  lpoke HMI,4*4,ID_CH1_2
  lpoke HMI,4*9,varptr(Name)
  InsertMenuItem Hch1 , ID_CH1_2 , 0, varptr(HMI) 
  
  Name="CCC"
  lpoke HMI,4*1,0x00000002|0x00000010
  lpoke HMI,4*4,ID_CH1_3
  lpoke HMI,4*9,varptr(Name)
  InsertMenuItem Hch1 , ID_CH1_3 , 0, varptr(HMI)
  
CreatePopupMenu: Hch2=stat
  
  Name="XXX"
  lpoke HMI,4*1,0x00000002|0x00000010
  lpoke HMI,4*4,ID_CH2_1
  lpoke HMI,4*9,varptr(Name)
  InsertMenuItem Hch2 , ID_CH2_1 , 0, varptr(HMI)
  
  Name="YYY"
  lpoke HMI,4*1,0x00000002|0x00000010
  lpoke HMI,4*4,ID_CH2_2
  lpoke HMI,4*9,varptr(Name)
  InsertMenuItem Hch2 , ID_CH2_2 , 0, varptr(HMI) 
  
  Name="ZZZ"
  lpoke HMI,4*1,0x00000002|0x00000010
  lpoke HMI,4*4,ID_CH2_3
  lpoke HMI,4*9,varptr(Name)
  InsertMenuItem Hch2 , ID_CH2_3 , 0, varptr(HMI)
  
CreateMenu: Hpa=stat
  
  Name="情報"
  lpoke HMI,4*1,0x00000002|0x00000010|0x00000004
  lpoke HMI,4*4,ID_MENU1
  lpoke HMI,4*5,Hch1
  lpoke HMI,4*9,varptr(Name)
  InsertMenuItem Hpa , 0 , 0, varptr(HMI)
  
  Name="help"
  lpoke HMI,4*1,0x00000002|0x00000010|0x00000004
  lpoke HMI,4*4,ID_MENU2
  lpoke HMI,4*5,Hch2
  lpoke HMI,4*9,varptr(Name)
  InsertMenuItem Hpa , 0 , 0, varptr(HMI)
  
SetMenu hwnd, Hpa
  
stop
  
*command//コマンド処理
 if lparam==0{
  cID=LOWORD(wparam)
  if cID=ID_CH1_1{dialog "[AAA]が押されました。"}
  if cID=ID_CH1_2{dialog "[BBB]が押されました。"}
  if cID=ID_CH1_3{dialog "[CCC]が押されました。"}
  if cID=ID_CH2_1{dialog "[XXX]が押されました。"}
  if cID=ID_CH2_2{dialog "[YYY]が押されました。"}
  if cID=ID_CH2_3{dialog "[ZZZ]が押されました。"}
 }
return



posted by ? at 14:44| Comment(0) | WINAPIメモ | このブログの読者になる | 更新情報をチェックする

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メモ | このブログの読者になる | 更新情報をチェックする

2011年09月11日

メニューの作成

<メニューの付け方@・新版><現在メニューの付け方は新版に移行しています。>

ウィンドウにメニューをつけるには次のような方法をとります。
@CreateMenu関数で空のメニューを作る
AInsertMenuItem関数でメニューに項目を足す。
BSetMenu関数でメニューをウィンドウに張り付ける。
Concmd[hsp]で、項目が選択されたか判定する。

@CreateMenu関数で空のメニューを作る
CreateMenu : Hpa=stat
これを実行すると空のメニューが作成されます。戻り値にはメニューハンドルが帰って来ます。
これはメニューの識別に必要なので保持しておきます。

AInsertMenuItem関数でメニューに項目を足す。
InsertMenuItem hmenu,uItem,fByPosition,lpmii
これを実行するとメニューに項目が追加されます。
hmenu:項目を追加する先のメニューを指定します。
uItem:追加したい項目の場所の後ろにある項目のIDを指定します。一番後ろに入れたいときは、自らの項目のIDを指定します。
fByPosition:0を指定してください。
lpmii:MENUITEMINFO構造体のアドレスを指定します。
MENUITEMINFO構造体には、追加する項目の情報をインプットします。

BSetMenu関数でメニューをウィンドウに張り付ける
SetMenu hWnd,hMenu
これを実行すると作成されたメニューをウィンドウに張り付けることができます。

Concmd[hsp]で、項目が選択されたか判定する。
oncmd gosub *command, $111
これを実行すると、どれかの項目が押された時、*commandにジャンプします。
メニューバーの項目が押された時、lparamは0になります。0で無い時は違うので、判定しないでください。
lparamが0のときには、wparamの下位ワードに押された項目のIDが代入されます。
なのでそれを取り出して判定してください。
#define ctype LOWORD(%1) (%1 & $FFFF)
このマクロで下位ワードが取得できます。

以上を踏まえたうえで、プログラムを作成します。

<Menu1.hsp>
#include "user32.as"//関数を使うためのソースを結合
#define ctype LOWORD(%1) (%1 & $FFFF)//下位ワード取得マクロ

oncmd gosub *command, $111//コマンド処理

#enum ID_MENU1 = 1//メニュー用ID列挙
#enum ID_MENU2 


CreateMenu: Hpa=stat

Name="情報"
alloc HMI,48
lpoke HMI,4*0,48
lpoke HMI,4*1,0x00000002|0x00000010
lpoke HMI,4*4,ID_MENU1
lpoke HMI,4*9,varptr(Name)
InsertMenuItem Hpa , ID_MENU1 , 0, varptr(HMI)

Name="help"
lpoke HMI,4*4,ID_MENU2
lpoke HMI,4*9,varptr(Name)
InsertMenuItem Hpa , ID_MENU2 , 0, varptr(HMI)

SetMenu hwnd, Hpa

stop

*command//コマンド処理
if lparam==0{
cID=LOWORD(wparam)
if cID=ID_MENU1{mes "情報:情報はありません"}
if cID=ID_MENU2{mes "help:ヘルプはありません"}
}
return
posted by ? at 17:42| Comment(0) | WINAPIメモ | このブログの読者になる | 更新情報をチェックする
×

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