ページ 11

画面サイズ取得

Posted: 2010年6月21日(月) 01:01
by 釣り師
毎日のようにすみません。
今、時計を制作していまして、ソフトを起動したとき、デスクトップの右下にいつも表示したいと考えました。
しかし、人によってデスクトップの大きさはまちまちで僕のデスクトップのサイズに合わせて設定しても意味がありません。
それで、
最初に表示できる領域のサイズを取得し、そこから時計表示位置を計算してその場所に時計を表示しようと考えました。

そこで、添付した画像のように、黒く塗ったところだけ(下のタスクバー、Vistaの場合はガジェット領域を除いた部分。)画面のサイズを取得したいのです。
ちなみに、ゲームプログラミングの館のサイトの画像を塗りつぶしたのには悪意はありません。誤解を招くと困るので、先に断っておきます。

さて、自分でできるだけしらべた結果。
GetSystemMetrics関数を使用するということが分かりましたが、いまいちよくわかりません。

    // デスクトップ領域サイズの高さを取得
int nHeight = GetSystemMetrics( SM_CYSCREEN );
DrawFormatString(0,0,GetColor(125,125,125),"%d",nHeight);

で結果がどうなったか確認しようとしたのですが、画面に文字が描画されずに結果が分かりません。
もし、関数の使い方が違っていたり、考え方自体が根本的に違っていたらご指摘ください。

よろしくお願いします。
なお、返信が明日になってしまうことをあらかじめ断っておきます。

Re:画面サイズ取得

Posted: 2010年6月21日(月) 07:31
by シエル
関数の使い方はあっていると思います
実際にコピペして、ウィンドウの左上に文字が表示されました。

ですが、タスクバーを除いた高さではなく、画面全体の高さが取得されていると思います。
タスクバーの長さを取得する方法は…分かりません…

Re:画面サイズ取得

Posted: 2010年6月21日(月) 14:49
by shiro4ao
タスクバーの大きさは以下のようにして取得できるようです。
目的が間違っていたらすみません。

==============GetTaskBarRect.cpp========================
#include <stdio.h>
#include <windows.h>
int main()
{
HWND hWndTaskBar;
RECT rc;
int x,y;

//タスクバーのウィンドウハンドルを探してくる
hWndTaskBar = FindWindow("Shell_TrayWnd", NULL);

//タスクバーの領域の大きさをもらい、計算する
GetClientRect(hWndTaskBar, &rc);
x = rc.right - rc.left;
y = rc.bottom - rc.top;

//表示する
printf("x座標ー>%d y座標ー>%d",x,y);
return 0;
}
===============ここまで===================================

もっとエレガントな方法があるかもしれません・・・・

追記:よく考えたら、タスクバーがいろいろな場所にあったり自動で隠
   すようになっていたら、タスクバーの位置も考慮に入れる必要が
   ありそうです。 画像

Re:画面サイズ取得

Posted: 2010年6月21日(月) 14:58
by シエル
タスクバーのウィンドウクラス名って「Shell_TrayWnd」なんですね。
勉強になりました。

>>DecentLoveさん
GetSystemMetrics( SM_CYSCREEN)から、上記のようにタスクバーの高さを求めて引けば、
タスクバーを除いた高さが取得できると思いますよ。

Re:画面サイズ取得

Posted: 2010年6月21日(月) 18:55
by 釣り師
シエルさん。shiro4aoさん。
ありがとうございます!

さっそくshiro4aoさんにいただいたソースを使って試しに計算したサイズを表示させてみたところ。

//タスクバーの領域の大きさをもらい、計算する
GetClientRect(hWndTaskBar, &rc);
x = rc.right - rc.left;
y = rc.bottom - rc.top; 
  
  ~~~~~中略~~~~~

DrawFormatString(0,0,GetColor(125,125,125),"%d テスト。横:縦 %d",x,y);


として、実行してみました。ちなみにDx_Libを使用しているのでDrawFormatStringで描画しました。
そしたら、僕のディスプレイの解像度は1440*900なのですが、横(x)は「1440」と縦(y)は何故か「40」としか表示されませんでした。
なぜだかわかりますでしょうか?

それと僕はまだプログラミングには疎く、素人なので
HWND hWndTaskBar;
RECT rc;
int x,y;

//タスクバーのウィンドウハンドルを探してくる
hWndTaskBar = FindWindow("Shell_TrayWnd", NULL);

//タスクバーの領域の大きさをもらい、計算する
GetClientRect(hWndTaskBar, &rc);
x = rc.right - rc.left;
y = rc.bottom - rc.top;
;

の辺りがいまいちよくわかりません。
解説していただければ幸いです。

わがままばかり申し訳ありません。
よろしくお願いします。

Re:画面サイズ取得

Posted: 2010年6月21日(月) 19:15
by シエル
>>そしたら、僕のディスプレイの解像度は1440*900なのですが、横(x)は「1440」と縦(y)は何故か「40」としか
>>表示されませんでした。
正しいのでは?
「タスクバー」の横の長さは1440で、縦は40ぐらいだと思われますが。
shiro4aoさんが提示してくださったソースは、タスクバーの長さを求めているので間違いないと思います。

それと、

HWNDという型はウィンドウハンドルと呼ばれる型で、
ウィンドウ一つ一つにある、ウィンドウそれぞれを識別するための番号みたいなものです。

それを↓のFindWindow(ウインドウクラス名、ウインドウテキスト)という関数を使用して、
引数に指定したウインドウクラス名とウィンドウテキストのペアの
ウィンドウを探してきて、そのウィンドウハンドルを変数に入れてます。
hWndTaskBar=FindWindow("Shell_TrayWnd", NULL)

GetClientRect(ウィンドウハンドル, RECT構造体のポインタ)関数を使って、
そのウィンドウのクライアント領域の大きさをRECT構造体に格納します。

そして、↓の計算で実際の横の長さと縦の長さを求めてます。
x = rc.right - rc.left;
y = rc.bottom - rc.top;

超大雑把に説明するとこんな感じです。

これらはWindowsAPIの関数です。
私は下記のサイトで勉強しました。参考にしてみてください。
全部やるとしんどいので、必要なところだけでいいです><
http://wisdom.sakura.ne.jp/system/winap ... index.html

追記:
WindowsAPIを勉強すると、DXライブラリを使うよりも細かい制御がしやすくなりますが、
ちょっと難しいかもしれないので、無理に勉強しなくてもいいですよ。


画像

Re:画面サイズ取得

Posted: 2010年6月21日(月) 22:14
by 釣り師
シエルさん。
ありがとうございます。
なるほど。タスクバーの方を求めていたんですね。
では、取得した値の中に縦サイズ(900px)があってそこから40px引くような感じのソースを組めばいいのですね。

ありがとうございました。

では、これにて解決としたいと思います。
ありがとうございました。

APIについては、随時自分のしたいことに合わせて学んでいこうと思います。
そのかていで、わからないことなどをまた、ココで機構と思います。
有難うございました。