リージョン・ウインドウを解除(切り替え)する方法は? – プログラミング – Home

リージョン・ウインドウを解除(切り替え...
 
通知
すべてクリア

[解決済] リージョン・ウインドウを解除(切り替え)する方法は?


ぴょぴょ
 ぴょぴょ
(@ぴょぴょ)
ゲスト
結合: 17年前
投稿: 82
Topic starter  

またお世話になります。

今回は一度設定したリージョン・ウインドウ(丸型など)を
元の長方形(矩形)や別の形(三角形)などに切り替える方法は
どうすればよろしいでしょうか?

僕の考え方からすると
1...GetWindowRgnでウインドウに設定されたリージョンを取得
2...DeleteObjectで先ほど取得したリージョン・ハンドルを削除
このステップでリージョン・ウインドウを解除できますか?

さらに
3...解除した後に新たなリージョンをSetWindowRgnで形を変更
この方法で新しいリージョンをウインドウに設定(変更)出来ますか?

疑問としてはGetWindowRgnはリージョンをコピーするとなっている点です。
最初に設定したリージョンを取得してコピーを作るため別のリージョンに
なりますよね。だからSetWindowRgnで設定したリージョンを保存しておき
これをDeleteObjectで削除してよいのでしょうか?

知りたいことはリージョン・ウインドウをプログラムを再起動することなく
元の長方形に戻す(解除)と領域の切り替えの方法です。

ちょっと長くなりましたが
よろしくお願い致します。


引用未解決
トピックタグ
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

GetWindowRgnは「指定されたウィンドウのウィンドウリージョンのコピーを取得します。」
とあるので、これを削除しても元のリージョンに影響はない。

解除するためには、SDKでもMFCでもNULLでSelectClipRgnする。
ということがMSDNに書いてある。


返信引用
ぴょぴょ
 ぴょぴょ
(@ぴょぴょ)
ゲスト
結合: 17年前
投稿: 82
Topic starter  

たいちうさん。
書き込みありがとうございます。

> GetWindowRgnは「指定されたウィンドウのウィンドウリージョンのコピーを取得しま
す。」
> とあるので、これを削除しても元のリージョンに影響はない。
やっぱり。

> 解除するためには、SDKでもMFCでもNULLでSelectClipRgnする。
> ということがMSDNに書いてある。
僕も質問前にMSDNサイトを見てました。
SetWindowRgn、GetWindowRgnには書かれてなかったです。
どちらのページに書いてあるのですか?

あとSelectClipRgnのどの引数にNULLを指定するのですか?

hDC = GetDC( hWnd );
SelectClipRgn( hDC, NULL );
ReleaseDC( hWnd, hDC );
これで解除ができますか?

試してみましたが丸型から普通の長方形ウインドウに
戻りませんでした。

ただし上記の3行を行った後に三角形のリージョンを
SetWindowRgnで設定すると切り替えは正常に出来ました。

切り替え部分のソースです。
case WM_RBUTTONUP:
{
 static int count;
 HRGN hRgn;
 HDC hDC;
 
 switch ( count = (++count % 4) ){
  case 0:
   hRgn = CreateEllipticRgn( 0, 0, 256, 256 );
   SetWindowRgn( hWnd, hRgn, TRUE );
   break;
  case 1:
   hDC = GetDC( hWnd );
   SelectClipRgn( hDC, NULL );
   ReleaseDC( hWnd, hDC );
   break;
  case 2:
   hRgn = CreateRoundRectRgn( 0, 0, 200, 100, 10, 10 );
   SetWindowRgn( hWnd, hRgn, TRUE );
   break;
  case 3:
   hDC = GetDC( hWnd );
   SelectClipRgn( hDC, NULL );
   ReleaseDC( hWnd, hDC );
   break;
 }
 break;
}


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> SetWindowRgn、GetWindowRgnには書かれてなかったです。
> どちらのページに書いてあるのですか?

SelectClipRgnのページです。これはクリッピングの解除でした。
私の勘違いでぴょぴょさんの解除したいリージョンは、
クリッピングのリージョンのことと思ったからです。

で、本題ですが、多分長方形のリージョンを作って、
それをセットすれば良いと思うけど、あまり自信がないので
後で試して見ます。SelectClipRgnなしで多分いけると思うけど。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

SetWindowRgnでもNULLでいいんじゃん。

http://msdn.microsoft.com/ja-jp/library/cc428761.aspx
> リージョンのハンドルを指定します。このリージョンが、新しいウィンドウリージョン
になります。
> hRgn が NULL の場合、この関数はウィンドウリージョンを NULL に設定します。

switch (count = ++count % 4) {
case 0:
hRgn = CreateEllipticRgn( 0, 0, 256, 256 );
SetWindowRgn( hWnd, hRgn, TRUE );
break;
case 1:
SetWindowRgn( hWnd, NULL, TRUE );
break;
case 2:
hRgn = CreateRoundRectRgn( 0, 0, 200, 100, 50, 50 );
SetWindowRgn( hWnd, hRgn, TRUE );
break;
case 3:
SetWindowRgn( hWnd, NULL, TRUE );
break;
}


返信引用
ぴょぴょ
 ぴょぴょ
(@ぴょぴょ)
ゲスト
結合: 17年前
投稿: 82
Topic starter  

たいちうさん。
ありがとうございます。

> SetWindowRgnでもNULLでいいんじゃん。
そうなんだ。

MSDNに書かれていた
> hRgn が NULL の場合、この関数はウィンドウリージョンを NULL に設定します。
NULLに設定とは解除という意味なんだ。

もう一つよろしいでしょうか。
SetWindowRgn( hWnd, NULL, TRUE );
とした場合は設定されていたリージョンはSetWindowRgn関数が
自動的に削除してくれるんですよね。
この考えてよろしいでしょうか?


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

よろしいです。削除してはいけません。

> 特に、このリージョンハンドルを削除しないでください。
> 必要がなくなると、システムはこのリージョンハンドルを自動的に削除します。


返信引用
ぴょぴょ
 ぴょぴょ
(@ぴょぴょ)
ゲスト
結合: 17年前
投稿: 82
Topic starter  

何度もありがとうございました。
解決。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

ちょっと追記。

ぴょぴょさんの質問への答えはいずれもMSDNに書いてあったもので、
ぴょぴょさんも質問の前に読んでいたはずのものです。

ウィンドウリージョンとは何か、リソースの削除とは何か等を
既にある程度知っている人には十分な説明ですが、
そうでない人には分かりにくい説明なのですね。
(理解してない人にも分かりやすい関数リファレンスを書くのは非常に困難でしょう)

MSDNを参考に自力でプログラムを作る力を付けるには、
MSDNに書かれていない(or 見つけにくい)概念の理解が必要です。
MSDNの行間を読んだり、(正しいとは限らないが)解説している個人のHPを
見つけたりしながら理解を深めましょう。
SDKに限りませんが、私も(おそらく)他の回答者もその道の途中です。

# 質問を控えろなどと言っている訳ではないです。念のため。


返信引用
ぴょぴょ
 ぴょぴょ
(@ぴょぴょ)
ゲスト
結合: 17年前
投稿: 82
Topic starter  

僕も追記。

> ウィンドウリージョンとは何か、リソースの削除とは何か等を
> 既にある程度知っている人には十分な説明ですが、
> そうでない人には分かりにくい説明なのですね。
リージョンはただいまお勉強中です。

GDIオブジェクトについては一通り勉強しました。
でもGDIオブジェクトを何時削除すべきかが難しいところです。
基本としては使い終わったら(必要じゃなくなると)DeleteObjectする。

でもSetWindowRgn関数は設定するとシステムが管理して
システムが自動的に削除するとMSDNに書かれていました。

プログラムが終了するときには自動的に削除してくれるのは
分かりますが、リージョンを途中で切り替えるときはどうなるのか
直接は書かれていないため質問してみました。

ちなみにリージョンは次の場所でお勉強しました。
http://wisdom.sakura.ne.jp/system/winapi/win32/win34.html
他にも参考にしたサイトは多くありますが
途中で切り替えるとか、解除に関しては見つかりませんでした。

最近ようやくGDIオブジェクトを何時削除すべきかが
分かり始めたのです。GDIの概念が難しいです。

知識を深めるために本も数冊買い読みましたが
なかなかGDIの詳しい解説はなく、APIの使い方ばかりです。
出来ればGDIの全体像や構造の概念を解説している本や
サイトがあれば助かります。

もしご存知であれば教えてほしいです。


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> プログラムが終了するときには自動的に削除してくれるのは
> 分かりますが、リージョンを途中で切り替えるときはどうなるのか
> 直接は書かれていないため質問してみました。

「プログラム終了時に削除」とは書かれていません。「必要がなくなると」です。
さらに「これ以降は…削除しないでください。」とあるので、
リージョンを何度替えようと、ほっといて良いと読めると思うのですが。

> 出来ればGDIの全体像や構造の概念を解説している本や
> サイトがあれば助かります。

GDIの本やサイトという意味ではお勧めできるようなものを知りません。
既にご存知かもしれませんが、SDK全般ならば『プログラミングWindows第5版』
が定番だと思います。古い本ですが、SDKの初心者には今でもお勧めします。
ぴょぴょさんの場合は、既にある程度の知識があると思いますので、
もしかしたら冗長に感じるかもしれません。大きな本屋ではまだ見かけますので、
GDIについてなど、どのような説明がされているかを買う前に見てみると良いと思います。

サイト『猫でもわかるプログラミング』は多分ご存知でしょう。
ふざけた文章ですし、あまり体系的とはいえないですが、
相当のボリュームのサンプルがあり、随所に丁寧な説明もあります。
丁寧に読んでサンプルを動かせば、相当な収穫があると思います。
(『標準 Windows API』の内容をしっかり理解できるならば不要かも)

『プログラミングWindows第5版〈上・下〉』
http://www.amazon.co.jp/dp/4756136001
http://www.amazon.co.jp/dp/475613601X

『猫でもわかるプログラミング』
http://www.kumei.ne.jp/c_lang/
http://www.kumei.ne.jp/c_lang/index_sdk.html


返信引用
ぴょぴょ
 ぴょぴょ
(@ぴょぴょ)
ゲスト
結合: 17年前
投稿: 82
Topic starter  

>『プログラミングWindows第5版〈上・下〉』
この本は既に数年前に知っていました。
でもまだ買っていません。
チェックはしていました。
ほしいと思いましたので。

>『猫でもわかるプログラミング』
こちらは入門として購入した本です。
サイトも参考にしました。
ただサイトのほうは出来が悪いというか
ワーニングがたくさん出たりします。
TEXT()を使っていないのでここの部分で修正。

結局、僕が持っている本でAPI関連は次の本です。
http://www.amazon.co.jp/dp/4894713713/
http://www.yodobashi.com/enjoy/more/i/cat_36230034_36288236_36288348/3193395.ht
ml

猫でもわかるシリーズはC#以外は買いました。
入門としては分かりやすかったです。

あと赤坂玲音さんの本も少々。
http://www.amazon.co.jp/dp/4797325453/
http://www.amazon.co.jp/dp/4797331976/
これらはいずれも入門書ですね。
数年前に買った本です。
最近はあまり本を買っていないので。

次に買う本として『プログラミングWindows第5版』の
上・下を考えに入れておきたいと思います。

僕の近くの本屋では置いてないため
ネットで注文する形になりそうです。
中が見れないのが残念です。

いろいろとアドバイスをありがたいです。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました