お品書き

備忘録(2005/05/18更新)
一応自分で発見したり、教えてもらった技等のメモでやす
疑問点です(2001/07/21更新)
製作上の疑問点をまとめておきますので、知っている方は是非私に連絡を! ここは私のWebページではわりと真剣なページです(マテ)

備忘録

こちらは基本的に下の私の疑問点等が解決した場合記します。

マウスオーバーすると強調表示するコントロールを作るするには?(2006/10/7)

マウスがコントロールの上にある事はWM_MOUSEOVERを使えばよいが、マウスが無い、という事を検知することは単純にメッセージを取得する事では実現不能。
そこで、マウスがコントロールの上に来た時点でWinSetCaptureを発行する。
こうすれば、マウスのメッセージはすべてWinSetCaptureを発行したコントロールに渡るので、マウスの位置がコントロールを外れたらWinSetCapture(NullHandle)を使ってリリースしてから、強調動作を解除すればよい。

メッセージキューからある種類のメッセージを取得するには?(2005/5/18)

たとえばWinPeekMsg(Anchor,Quee,0,WM_CHAR,WM_CHAR,PM_NoReMove)を使うとWM_CHARで始まって、WM_CHARで終わるMsg列がキューに溜まっているのが分かる。
そこで、WinGetMsg(Anchor,Quee,0,WM_CHAR,WM_CHAR)でキューを一つづつ取得してあげればよい。これを応用して、IMEで変換済みの文字列を一気に取得できる。エディタを作る人はこーゆーノウハウはやはり必須ではないかと。

クリップボードにテキストをコピーするには?(2003/8/30)

WinSetClipbrdDataだけでは駄目で、その前にDosSetSharedMemなりDosAllocSharedMemなりで、他アプリとの共有可能なメモリを作って(おそらくアプリが終了してもクリップボードに残るようにアプリのメモリ空間外に作られている)それからWinSetClipbrdDataしないとテキストデータはコピーできない。でもbmpデータとかは何故かこういう事、しないんだよなぁ。なんでだろー。

動的にアプリケーションの枠を変更するには?

諏訪(JJ☆)さん、A.Y.DAYOさんから回答をいただきました。大体以下の様になるそうです。

   /* フレーム・ウィンドウのスタイルを取得 */
   ULONG style = WinQueryWindowULong( hwframe ,QWL_STYLE );
   /* スタイル中のボーダー種類ビットを抽出 */
   ULONG border = style & (FS_BORDER|FS_DLGBORDER|FS_SIZEBORDER);
   /* フレーム・ウィンドウのスタイルをボーダー種類ビットOFFで設定し直し */
   WinSetWindowULong( hwframe ,QWL_STYLE ,style - border );
   /* ボーダーが変更された旨のメッセージを送付 */
   WinSendMsg( hwframe ,WM_UPDATEFRAME ,MPFROMLONG(border) ,0 );

諏訪さんはその他に、タイトルバーを消してもマウスで移動させる方法については、タイトルバーにメッセージを流すのではなくて、WM_MOVEとかそのテの(詳細を忘れましたが)メッセージを本体に流して上げた方が良いのではないか、という事でした。でも、駄目な私はよくわからなかったんだぁぁぁ

WM_CLOSEとWM_DESTROYってどうやって区別するんでしょう(2001/07/27)

いや、呼んで字のごとく、どうなってんのかなー、と思いまして。というか、スレッドバリバリ使っている場合、どっちでキルスレッドした方がいいのかなぁ、と思いまして。

畠山さんから回答をいただきました。一応WM_CLOSEはユーザーがクローズをさせる時、で、WM_DESTROYはさらにWM_CLOSEの結果、システムが終了動作させるアクションという事でした。

ところで、アプリで起動させたタイマーやスレッドって終了時にソースで明示しなくても、ちゃんと終了動作を行ってくれるんでしょうか?(一応処理はしてくれる事になっているようですね)

「水」のプラグイン、xxx.watを読み込むには

DosLoadModuleでxxx.wat等と拡張子がdllでないDLLを読み込むには完全修飾、つまりフルパスで指定してあげる必要があるようです。

「Tms Rmn Bold Italic」の18ポイントを作れない

GpiCreateLogFontでフォントを作ろうとするのですが、Bold,Italicが入ると何故かかならずシステムのデフォルトのポイントが返って来ます。pixelはFontMetricsの数値を使ってあげているのになぁ・・・。誰かGpiCreateLogFontに渡すFATTRの値等を教えて下さい(^^;)
これについては、ナーガさんよりメールがありました!ありがとうございます!

  fsFontUse:=FATTR_FONTUSE_OUTLINE;
  fat.lMaxBaseLineExt:=0;
  fat.lAveCharWidth:=0;
  として、最後に
  siz.cx:=MAKEFIXED(lemHeight,0);
  ////高さと同じ値を入れるがポイント
  siz.cy:=MAKEFIXED(lemHeight,0);
  GpiSetCharBox(WinPS,Siz);
  と、すればよし、との事。

つまり、ビットマップフォントの場合は単純にGpiCreateLogFontに文字の幅と高さのビットを上げればいいのですが、アウトラインフォントの場合、基底の文字を出してやって、その後、GpiSetCharBoxで大きさを設定して上げる、という事らしいですなぁ。

WinDrawTextのフラグ、DT_QUERYEXTENTについて

通常WinDrawTextでは、何も考えずにflagは0としておけば大体Okなんですが「DT_QUERYEXTENT」とすると、文字が描写されません。これって、手続き的には合っているんでしょうか?そもそも、あのフラグ(DT_QUERYEXTENT)ってどういう意味なんでしょう?

その後、参考書を見ると、DT_QUERYEXTENTって本当に表示されないらしい・・・

フォントがDrag&Dropされた場合、どうやって知るのか

WM_PRESPARAMCHANGEDのメッセージを使うのは想像できるんですが、param1とparam2にどんなパラメータが来るのか、さっぱり分かりません。だれか教えて〜〜

これに関しては、自己解決。param1にpp_fontchangedとかいう(名称不明確)ppが頭につくパラメータが来るのであった。多分param2にはフォント名文字列の(10.Helv combinedという感じの)ポインターが入っていると思うけどポインター渡しはpascalだと、ちっと恐いのでやってません。単に怠慢とも言うが。

面白いのは、フォントが落ちる前のHPSを保持して、このHPSで画面表示をすると、前のフォントで表示されるんですね。なんで?

ウインドウハンドルについて

何故か、ウインドウについて操作する場合のhandleはWinCreateWindowで生成するハンドルではなく、メッセージのハンドラーに与えられるハンドルじゃないと上手くいきません。ところが、WM_Destroyにはこのメッセージハンドラではなく、WinCreateWindowで生成したフレームハンドルじゃないと駄目です。したがって、メッセージハンドラでWM_Destroyを捕まえることは事実上不可能の様です。ただ、いくらなんでもこれって変ですので、勘違いしている可能性大。識者の回答を待つ次第。

本当に、識者の畠山さんから回答がありました。ありがとうございます。try02.htmlを見て下さいませ。

タイトルバーやメニューを消す方法

これは、vetteさんの「100万人の煩悩生活」から上がるとOS2のページがあって、こいつをみればオッケー。urlは忘れた。(オイオイ)確か今はhttp://world.uraru.net/~vette/os2/だと思いました。(不安ですんで、リンクはつけとりません。^^;)

IMEをプログラムからON-OFFする場合

Virtual Pascal,Sibyl共にそんなツールキットは無いので、DLL直叩き、という事になります。一応Sibylの定義としては

    IMEMode=RECORD
        Length:ULONG;
        Flag:ULong;
        fg1,fg2:ULong;
    END;
    pIMEMode=^IMEMode;

IMPORTS
FUNCTION Win32DBCSIMEControl( anchor:HAB;
                              hwndFrame:HWND;
                              ulType:ULONG;
                              pIME:pIMEMode ):ULONG;
         APIENTRY;'PMNLSFEP' index 329;

上記のように、PMNLSFEP.DLLのindex329の関数、Win32DBCSIMEControlを叩く、訳です。一応、Warp3とWarp4で動作を確認してます。

IMEModeのulTypeは2で固定でOk、flagはIMEをONの時=5、OFFの時=9でとりあえずok。後は全て0です。

Niftyのthrowさんに教えて頂きました。:-)ところで、vioでも使えるのでしょうか、これ。


疑問点

こちらは、私の分からない事を誰かに教えてもらおうというコーナーです(^^;)

FixPak14以降、アプリにフォルダーを渡すと起動しない(2001/07/21)

引数を表示するダケのアプリを作って試した所、FixPak14以降、どうもフォルダーをアプリにドロップした場合、アプリその物が起動しません。これ、事情を知っている人いませんか?データファイルならオッケーなんですが・・・・

handle又はファイル名が分かった場合 アイコンを取り出すことが出来るか?

ハンドルがわかれば、システムメニューのハンドルが分かるはずで、ここまでくれば、アイコン位なんとか分かりそうな気がするのですが、(これもやり方、よくわからんのですが、それはさておき)これがファイル名の場合でもokなんでしょうか?いや、要はWinLoadFileIconだと関連付けされた元ファイルのアイコンなんかは取れないので・・・

タスクスイッチからはタスクのアイコンハンドルがあるんで、これから取れば良いのは分かるんですが、通常のファイル名から引っ張って来るのはどうするんでしょうねぇ・・・


index.html