ウィンドウクライアント領域DCのはずが?

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
Indigo Visualist
記事: 33
登録日時: 2006年5月22日(月) 21:01
お住まい: 山口
連絡する:

ウィンドウクライアント領域DCのはずが?

#1 投稿記事 by Indigo Visualist »

お世話になります。現在デバイスコンテキストやらビットマップの操作に四苦八苦していまして、
資料を読んで少しずつ理解し始めていたのですが、どうしても不可解な現象に行き当たってしまったので、
自分の手には負えず、ご教授して頂きたいです。
まず、Oriosさんのページより、スケルトンウィンドウのコードをお借りして、次のようなコードを書きました。 そしてこれを実行したところ、ウィンドウのクライアント領域でなく、デスクトップ画面の左上に黒い四角が表示されてしまいました。
どうしてこのようなことが起るのでしょうか?

P.S.
44行目の

コード: 全て選択

			hMainDC = GetDC(hMainWnd)

コード: 全て選択

			hMainDC = GetDC(hWnd)
に変えるとちゃんとクライアント領域に表示されました。
この書き方に問題があるんでしょうか?
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

Re: ウィンドウクライアント領域DCのはずが?

#2 投稿記事 by 7 »

> そしてこれを実行したところ、ウィンドウのクライアント領域でなく、デスクトップ画面の左上に黒い四角が表示されてしまいました。
> どうしてこのようなことが起るのでしょうか?
WM_CREATEが送られてくる時、ってのがまだhMainWndにウィンドウハンドルを代入する前だからじゃないでしょうか?
hMainWndに対してのデバイスコンテキストを取得してるんじゃなくて、0に対してのデバイスコンテキストを取得しちゃってると。
NoWest
記事: 264
登録日時: 2005年5月31日(火) 10:52
お住まい: 高知
連絡する:

#3 投稿記事 by NoWest »

取り合えず、解決のヒントを書いておきます。

GetDCはウィンドウ全体のデバイスコンテキストを取得します。
しかし、実際にはユーザが描画するのはウィンドウのクライアント領域だけなので
GetDCは特別な理由が無い限りは使用しません。

また、Createイベントでデバイスコンテキストを取得するのもおススメしません。
GetDCでやるとしてもPaintイベントでhWndを指定して毎回取得した方がよいです。
というのもCreateイベントで得られたデバイスコンテキストと現在描画対象となっているデバイスコンテキストに互換性があるという保障が無いからです。

ですので、描画に使用するデバイスコンテキストはGetDCを使わないで取得しましょう。

ってことでBeginPaint、EndPaintをヘルプかネットで調べてみてください。


P.S.
7様が先に書き込まれたようですね。内容は違いますが。。。

7様が仰るようにWM_CREATEメッセージが送信されてきた時には
まだhMainWndの中身は0です。

順番としては
1.CreateWindowEx関数が呼ばれる。
2.ウィンドウが作成される。(まだCreateWindowExは実行中)
3.WM_CREATEメッセージが送信される。(まだCreateWindowExは実行中)
4.CreateWindowEx関数が終了し戻り値にハンドルが返る。

私も最初のうちは戸惑いました。(笑

Indigo Visualist
記事: 33
登録日時: 2006年5月22日(月) 21:01
お住まい: 山口
連絡する:

#4 投稿記事 by Indigo Visualist »

ご回答ありがとうございます。おかげで納得することができました。
>7さん
WM_CREATEが送られてくる時、ってのがまだhMainWndにウィンドウハンドルを代入する前だからじゃないでしょうか?
これは初めて知りました。今後気をつけるようにします。
hMainWndに対してのデバイスコンテキストを取得してるんじゃなくて、0に対してのデバイスコンテキストを取得しちゃってると。
これも初めて知りました。GetDCでデスクトップ画面のDCまで取得できるんですね。

>NoWestさん
GetDCはウィンドウ全体のデバイスコンテキストを取得します。
しかし、実際にはユーザが描画するのはウィンドウのクライアント領域だけなので
GetDCは特別な理由が無い限りは使用しません。
すみません、ヘルプを確認したのですが、GetDCはクライアント領域で、
ウィンドウ全体を取得するのはGetWindowDCではないでしょうか?
というのもCreateイベントで得られたデバイスコンテキストと現在描画対象となっているデバイスコンテキストに互換性があるという保障が無いからです。
そうだったんですか。気をつけるようにします。

お二人とも本当にありがとうございました。
返信する