タイトルから次の画面へ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
じぇれみあ

タイトルから次の画面へ

#1

投稿記事 by じぇれみあ » 15年前

タイトルで、スペースキーを押されたら次の画面に進むようにしたいので、とりあえず画面を黒くしたいのですが、
if (Key[KEY_INPUT_SPACE]==1){

DrawBox(0,0,640,480,black,TRUE);


これではスペースを押しても一瞬しか黒くなりません。
どうしても他のやり方が思いつかないのですが・・・
初歩的な質問ですが教えていただければ幸いです。

シエル

Re:タイトルから次の画面へ

#2

投稿記事 by シエル » 15年前

スペースを押したらフラグを立てる。

フラグが立ってるときに描画する。

以上。

じぇれみあ

Re:タイトルから次の画面へ

#3

投稿記事 by じぇれみあ » 15年前

それは具体的にどうすればいいんでしょうか・・・?
int next;
if (y==280&&Key[KEY_INPUT_SPACE]==1){
next=1;
if (next==1){
DrawBox(0,0,640,480,black,TRUE);
}
}
こういうことでしょうか・・・(-_-;)

dic

Re:タイトルから次の画面へ

#4

投稿記事 by dic » 15年前

プログラムの基本構造
「選択」を考えればいけるでしょうね

シエル

Re:タイトルから次の画面へ

#5

投稿記事 by シエル » 15年前

ループさせているのであれば、常にループしていることを意識して。

Dixq (管理人)

Re:タイトルから次の画面へ

#6

投稿記事 by Dixq (管理人) » 15年前

状態を示す変数が必要ですね。
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:タイトルから次の画面へ

#7

投稿記事 by じぇれみあ » 15年前

できました!!

教えてくれた皆さん、ありがとうございました!!

さんg

デスクトップへの描画

#8

投稿記事 by さんg » 15年前

 
こんにちは。
私は現在、「伺かのようなデスクトップマスコットを作りたい!」という欲望の赴くままに、
デスクトップへの描画について試行錯誤しています。

現在下記コードのようにして、作成したウィンドウへの描写は出来ましたが、
デスクトップへの描写、ということが出来なくて困っています。

過去ログを検索したところ、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:デスクトップへの描画

#9

投稿記事 by シエル » 15年前

GetDCにNULLを指定してもできませんか?

toyo

Re:デスクトップへの描画

#10

投稿記事 by toyo » 15年前

シエルさんの指摘のように
hdc_desk = GetDC( NULL );
でデスクトップへの描画が出来るはずですがデスクトップマスコットの場合はウィンドウ枠のないウィンドウ(WS_POPUP)を作って描画するのが一般的なような気がします。

さんg

Re:デスクトップへの描画

#11

投稿記事 by さんg » 15年前

 
GetDC(NULL)で無事に描画することが出来ました、ありがとうございました!
デスクトップに無効リージョンを発生(?)させるのも、InvaldateRectでhwnd_deskを指定すればいいのでしょうね。(多分、きっと)

しかしデスクトップに直接描写する、というのもなかなか大変なんですね…。
枠の無いウィンドウが使用できるのであれば、そちらを使用していきたいと思います。

また何かありましたら、よろしくお願いします。

   //気まぐれで追加した HDCとHBITMAP に DeleteDCとDeleteObject を忘れるのはお約束ですね…恥ずかしい。
   //また、リンクできていないという…w 過去ログ32251のことです;;

シエル

Re:デスクトップへの描画

#12

投稿記事 by シエル » 15年前

枠なしウィンドウをお勧めします。

さんg

Re:デスクトップへの描画

#13

投稿記事 by さんg » 15年前

やはり枠なしウィンドウがいいようですねー。

WS_POPUPでググってみたいと思います! 画像

へろりくしょん

Re:デスクトップへの描画

#14

投稿記事 by へろりくしょん » 15年前

すでに解決されているようですが、

SetLayeredWindowAttributes()

も調べておくと幸せになれるかもしれません。

なぜだか余り知られていないAPIですので一応。

ISLe

Re:デスクトップへの描画

#15

投稿記事 by ISLe » 15年前

デスクトップマスコットならWindowsAPIのSetWindowRgnが欠かせないでしょう。
SetWindowRgnで検索すればデスクトップマスコットプログラムの入門サイトも見付かると思います。

#WM_CREATEの対応コードがとんでもないことになっていますが本筋でないのでスルーしておきます。

さんg

Re:デスクトップへの描画

#16

投稿記事 by さんg » 15年前

指定色を透過、また全体を半透明化させられる関数…ですかね?
マスク画像を用意する必要がなくなるのでしょうか。そうだったら幸せだ…w

ともあれ、この関数についても調べてみますね。
ありがとうございました!

さんg

Re:デスクトップへの描画

#17

投稿記事 by さんg » 15年前

 
これは…。入れ違いになってしまって返事(返答?)出来ていませんでしたね、すみません。

枠なしウィンドウなどを検索しているうちに出てきましたので、SetWindowRgn()についても検索させていただきますね。
遅くなりましたが、ありがとうございました。

    //WM_CREATEというと、58413番、デスクトップのスクリーンショットを保存にて指摘なさっていた、
    //「WM_PAINT以外の場所でのBeginPaint,EndPaintの動作保障」についてのことでしょうか。
    //ご指摘いただき、ありがとうございました。

ISLe

Re:デスクトップへの描画

#18

投稿記事 by ISLe » 15年前

>     //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するのは避けてください。
またデバイスコンテキストは必要なときに作成して不要になったらすぐに削除するのが望ましいです。

閉鎖

“C言語何でも質問掲示板” へ戻る