閉じるボタン「×」だけウィンドウ・左上のアイコンを消す・変更が反映されない
栞 2013/5/7(Tue) 23:03:19|NO.53891
閉じるボタン「×」だけのあるウィンドウが作成したくて、Win32APIのサンプルを探し、
HSP用に自分なりにプログラムを書いてみたのですが、思い通りに動作しません。
(参考にしたプログラムはCreateWindowExで作成していた)
#include "user32.as"
// マクロ
#define FALSE 0
#define TRUE 1
#define SC_MINIMIZE 0xF020
#define SC_MAXIMIZE 0xF030
#define SC_RESTORE 0xF120
#define SC_SIZE 0xF000
#define GCL_HICON -14
#define GCL_HICONSM -34
#define GWL_STYLE -16
#define GWL_EXSTYLE -20
#define WS_EX_DLGMODALFRAME 0x00000001
#define WS_MAXIMIZEBOX 0x00010000
#define WS_MINIMIZEBOX 0x00020000
#define SWP_NOSIZE 0x00000001
#define SWP_NOMOVE 0x00000002
#define SWP_NOZORDER 0x00000004
#define SWP_FRAMECHANGED 0x00000020
// システムメニューの変更
GetSystemMenu hWnd, FALSE
hSysMenu = stat
RemoveMenu hSysMenu, SC_MINIMIZE, FALSE
RemoveMenu hSysMenu, SC_MAXIMIZE, FALSE
RemoveMenu hSysMenu, SC_RESTORE , FALSE
RemoveMenu hSysMenu, SC_SIZE , FALSE
// アイコンなし
SetClassLong hWnd, GCL_HICON , 0
SetClassLong hWnd, GCL_HICONSM, 0
// アイコン、最大化/最小化ボックスの非表示
GetWindowLong hWnd, GWL_EXSTYLE
SetWindowLong hWnd, GWL_EXSTYLE, stat | WS_EX_DLGMODALFRAME
GetWindowLong hWnd, GWL_STYLE
SetWindowLong hWnd, GWL_STYLE , stat & ((WS_MAXIMIZEBOX | WS_MINIMIZEBOX) ^ 0xFFFFFFFF)
// ウィンドウを再描画 (SetWindowPosだと一部反映されない?)
SetWindowPos hWnd, 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED
最後のSetWindowPosで、最大化最小化ボタンの表示はちゃんと反映される (消える) のですが、
左上のアイコンだけ反映されません (消えてくれません) 。
Windows 7 64bit のAeroでは、gsel 0,-1 : gsel 0,1 で反映されたのですが、ベーシックだとだめでした。
他にちゃんとした方法があるのでしょうか…?
inovia 2013/5/7(Tue) 23:33:39|NO.53895
順番を入れ替えてみたところ、Aero/ベーシック環境でも反映されました。
// アイコン、最大化/最小化ボックスの非表示
GetWindowLong hWnd, GWL_EXSTYLE
SetWindowLong hWnd, GWL_EXSTYLE, stat | WS_EX_DLGMODALFRAME
GetWindowLong hWnd, GWL_STYLE
SetWindowLong hWnd, GWL_STYLE , stat & ((WS_MAXIMIZEBOX | WS_MINIMIZEBOX) ^ 0xFFFFFFFF)
// アイコンなし
SetClassLong hWnd, GCL_HICON , 0
SetClassLong hWnd, GCL_HICONSM, 0
ツノン 2013/5/8(Wed) 09:44:22|NO.53906
少し検証してみた
どうやら 拡張Styleに WS_EX_DLGMODALFRAME が指定されていない場合に 一度でも SetClassLong GCL_HICON に Null を指定すると SetWindowPos の SWP_FRAMECHANGED を 使用した際に IDI_APPLICATION のアイコンが代用される仕組みらしい。
#include "user32.as"
#define GCL_HICON -14
#define GCL_HICONSM -34
mes "-- WS_EX_DLGMODALFRAME が無い場合 --"
SetClassLong hWnd, GCL_HICON , 0
mes stat
SetClassLong hWnd, GCL_HICONSM, 0
mes stat
SetWindowLong hWnd, $FFFFFFEC/*GWL_EXSTYLE*/, $00000001/*WS_EX_DLGMODALFRAME*/
SetWindowLong hwnd,$FFFFFFF0/*GWL_STYLE*/,$10c80000/*WS_CAPTION|WS_VISIBLE|WS_SYSMENU|WS_OVERLAPPED*/
mes "-- WS_EX_DLGMODALFRAME が有る場合 --"
SetClassLong hWnd, GCL_HICON , 0
mes stat
SetClassLong hWnd, GCL_HICONSM, 0
mes stat
SetWindowPos hwnd,0,0,0,0,0,$00000027/*SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED*/
栞 2013/5/9(Thu) 16:33:25|NO.53921
>>inoviaさん
おお!!動きましたありがございます!!すっごい感謝です!!
順番を入れ替えればよかったとは…。気が付かなかった…。
>>ツノンさん
おお、そうだったのですか!!
検証ありがとうございます!返り値ちゃんと調べとけばよかった〜
解決しました!みなさんありがとうございました!