ページ 1 / 1
タイトルから次の画面へ
Posted: 2010年7月30日(金) 18:30
by じぇれみあ
タイトルで、スペースキーを押されたら次の画面に進むようにしたいので、とりあえず画面を黒くしたいのですが、
if (Key[KEY_INPUT_SPACE]==1){
DrawBox(0,0,640,480,black,TRUE);
}
これではスペースを押しても一瞬しか黒くなりません。
どうしても他のやり方が思いつかないのですが・・・
初歩的な質問ですが教えていただければ幸いです。
Re:タイトルから次の画面へ
Posted: 2010年7月30日(金) 18:54
by シエル
スペースを押したらフラグを立てる。
フラグが立ってるときに描画する。
以上。
Re:タイトルから次の画面へ
Posted: 2010年7月30日(金) 19:41
by じぇれみあ
それは具体的にどうすればいいんでしょうか・・・?
int next;
if (y==280&&Key[KEY_INPUT_SPACE]==1){
next=1;
if (next==1){
DrawBox(0,0,640,480,black,TRUE);
}
}
こういうことでしょうか・・・(-_-;)
Re:タイトルから次の画面へ
Posted: 2010年7月30日(金) 20:12
by dic
プログラムの基本構造
「選択」を考えればいけるでしょうね
Re:タイトルから次の画面へ
Posted: 2010年7月30日(金) 20:32
by シエル
ループさせているのであれば、常にループしていることを意識して。
Re:タイトルから次の画面へ
Posted: 2010年7月30日(金) 20:44
by Dixq (管理人)
状態を示す変数が必要ですね。
Statesという状態を表す変数を使って描画する関数を分けるプログラムを書いてみました。
#include "DxLib/DxLib.h"
void menu0(){
DrawBox(0,0,640,480,GetColor(100,0,0),TRUE);
DrawString(100,100,"メニュー0です",GetColor(0,0,0));
}
void menu1(){
DrawBox(0,0,640,480,GetColor(100,100,0),TRUE);
DrawString(100,100,"メニュー1です",GetColor(0,0,0));
}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
int States = 0;
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
while(!ScreenFlip()&&!ProcessMessage()&&!ClearDrawScreen()&&!CheckHitKey(KEY_INPUT_ESCAPE)){
switch(States){
case 0:
menu0();
if(CheckHitKey(KEY_INPUT_1)==1){
States=1;
}
break;
case 1:
menu1();
if(CheckHitKey(KEY_INPUT_0)==1){
States=0;
}
break;
}
}
DxLib_End();
return 0;
}
0キーや1キーを押してみて下さい。
キーを離しても状態が維持され続けるはずです。
キー入力により状態を変えたらその状態を維持し、処理を分ける必要がありますね。
Re:タイトルから次の画面へ
Posted: 2010年7月30日(金) 21:04
by じぇれみあ
できました!!
教えてくれた皆さん、ありがとうございました!!
デスクトップへの描画
Posted: 2010年8月09日(月) 16:41
by さんg
こんにちは。
私は現在、「伺かのようなデスクトップマスコットを作りたい!」という欲望の赴くままに、
デスクトップへの描画について試行錯誤しています。
現在下記コードのようにして、作成したウィンドウへの描写は出来ましたが、
デスクトップへの描写、ということが出来なくて困っています。
過去ログを検索したところ、
http://www.play21.jp/board/formz.cgi?ac ... 9&from=allにて、(直リンいいのかな)
GetDesktopWindow() という関数が使われており、これを使用すればHWND,HDC共に取得できて
描写なんて簡単じゃん!と考えていたのですが…。
// コード
#include<windows.h>
#include"fanctions.h"
#define GSIZE_X 215
#define GSIZE_Y 370
///////////////////////////////////////////////////
// ウィンドウプロシージャ
///////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp)
{
HDC hdc;
PAINTSTRUCT ps;
static HDC hdc_work;
static HBITMAP hb_work;
switch (msg) {
case WM_CREATE:
hdc = BeginPaint(hwnd , &ps);
hdc_work = CreateCompatibleDC(hdc);
hb_work = (HBITMAP)LoadImage(NULL , TEXT("char.bmp") , IMAGE_BITMAP , 0 , 0 , LR_LOADFROMFILE | LR_CREATEDIBSECTION);
if(hb_work == NULL) SendMessage(hwnd , WM_DESTROY , 0 , 0); //取得できなかったら終了
SelectObject(hdc_work , hb_work);
EndPaint(hwnd , &ps);
InvalidateRect(hwnd , NULL , false);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps); //ウィンドウに描写
BitBlt(hdc , 10 , 10 , GSIZE_X , GSIZE_Y , hdc_work , 215 , 0 , SRCPAINT);
BitBlt(hdc , 10 , 10 , GSIZE_X , GSIZE_Y , hdc_work , 0 , 0 , SRCAND);
EndPaint(hwnd, &ps);
return 0;
case WM_RBUTTONUP:
SendMessage(hwnd , WM_DESTROY , 0 , 0); //右クリで有無を言わさず終了
return 0;
case WM_DESTROY:
DeleteDC(hdc_work);
DeleteObject(hb_work);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd , msg , wp , lp);
}
WM_PAINTの、ウィンドウへの描写の後に
hwnd_desk = GetDesktopWindow();
hdc_desk = GetDC(hwnd_desk);
BitBlt(hdc_desk , 10 , 10 , GSIZE_X , GSIZE_Y , hdc_work , 0 , 0 , SRCCOPY);
ReleaseDC(hwnd_desk , hdc_desk);
と試しに追加してみたのですが、デスクトップへ描写はされませんでした。
使用言語はC(作成されたファイルこそcppですが、多分cの機能しか使ってないはず)で、
WINAPIを使って作成したいと思っています。
コンパイラは VC++2008 EE を使用しています。
ご教授の程、よろしくお願いします。
Re:デスクトップへの描画
Posted: 2010年8月09日(月) 16:46
by シエル
GetDCにNULLを指定してもできませんか?
Re:デスクトップへの描画
Posted: 2010年8月09日(月) 17:08
by toyo
シエルさんの指摘のように
hdc_desk = GetDC( NULL );
でデスクトップへの描画が出来るはずですがデスクトップマスコットの場合はウィンドウ枠のないウィンドウ(WS_POPUP)を作って描画するのが一般的なような気がします。
Re:デスクトップへの描画
Posted: 2010年8月09日(月) 18:04
by さんg
GetDC(NULL)で無事に描画することが出来ました、ありがとうございました!
デスクトップに無効リージョンを発生(?)させるのも、InvaldateRectでhwnd_deskを指定すればいいのでしょうね。(多分、きっと)
しかしデスクトップに直接描写する、というのもなかなか大変なんですね…。
枠の無いウィンドウが使用できるのであれば、そちらを使用していきたいと思います。
また何かありましたら、よろしくお願いします。
//気まぐれで追加した HDCとHBITMAP に DeleteDCとDeleteObject を忘れるのはお約束ですね…恥ずかしい。
//また、リンクできていないという…w 過去ログ32251のことです;;
Re:デスクトップへの描画
Posted: 2010年8月09日(月) 18:07
by シエル
枠なしウィンドウをお勧めします。
Re:デスクトップへの描画
Posted: 2010年8月09日(月) 20:08
by さんg
やはり枠なしウィンドウがいいようですねー。
WS_POPUPでググってみたいと思います!

Re:デスクトップへの描画
Posted: 2010年8月09日(月) 21:56
by へろりくしょん
すでに解決されているようですが、
SetLayeredWindowAttributes()
も調べておくと幸せになれるかもしれません。
なぜだか余り知られていないAPIですので一応。
Re:デスクトップへの描画
Posted: 2010年8月09日(月) 23:41
by ISLe
デスクトップマスコットならWindowsAPIのSetWindowRgnが欠かせないでしょう。
SetWindowRgnで検索すればデスクトップマスコットプログラムの入門サイトも見付かると思います。
#WM_CREATEの対応コードがとんでもないことになっていますが本筋でないのでスルーしておきます。
Re:デスクトップへの描画
Posted: 2010年8月09日(月) 23:50
by さんg
指定色を透過、また全体を半透明化させられる関数…ですかね?
マスク画像を用意する必要がなくなるのでしょうか。そうだったら幸せだ…w
ともあれ、この関数についても調べてみますね。
ありがとうございました!
Re:デスクトップへの描画
Posted: 2010年8月10日(火) 17:30
by さんg
これは…。入れ違いになってしまって返事(返答?)出来ていませんでしたね、すみません。
枠なしウィンドウなどを検索しているうちに出てきましたので、SetWindowRgn()についても検索させていただきますね。
遅くなりましたが、ありがとうございました。
//WM_CREATEというと、58413番、デスクトップのスクリーンショットを保存にて指摘なさっていた、
//「WM_PAINT以外の場所でのBeginPaint,EndPaintの動作保障」についてのことでしょうか。
//ご指摘いただき、ありがとうございました。
Re:デスクトップへの描画
Posted: 2010年8月11日(水) 01:17
by ISLe
> //WM_CREATEというと、58413番、デスクトップのスクリーンショットを保存にて指摘なさっていた、
> //「WM_PAINT以外の場所でのBeginPaint,EndPaintの動作保障」についてのことでしょうか。
> //ご指摘いただき、ありがとうございました。
BeginPaint,EndPaintを使ってはいけないこと以外にたくさんあります。
WM_CREATEメッセージはCreateWindow(CreateWindowEx)APIの中から呼び出されます。
エラーにしたいときはWM_CREATEメッセージの応答として-1を返してください。
CreateWindow(CreateWindowEx)APIがNULLを返します。
WM_CREATEメッセージの応答に0を返すとCreateWindow(CreateWindowEx)APIが成功し、WM_PAINTメッセージが発行され無効なハンドルを参照する可能性があります。
WM_CREATEメッセージ処理中のInvalidateRect呼び出しは既に無効領域なので意味がありません。
即座に描画したいときはCreateWindow(CreateWindowEx)APIの戻り値を使ってUpdateWindowを呼び出してください。
今回はメモリデバイスコンテキストなので不具合ないかもしれませんが、作法としてSelectObjectしたままDeleteDCやDeleteObjectするのは避けてください。
またデバイスコンテキストは必要なときに作成して不要になったらすぐに削除するのが望ましいです。