ウィンドウ作成

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
x_kai
記事: 29
登録日時: 14年前
連絡を取る:

ウィンドウ作成

#1

投稿記事 by x_kai » 14年前

C++でウィンドウを作ろうと思ったのですが、
思うように出来なかったので、どこか間違いがあれば、教えてください。

コード:

#include <windows.h>

// グローバル変数
HWND hMainWindow;
HINSTANCE hInstance;

//ウィンドウプロシージャ作成
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg){
        case WM_DESTROY:
            /*
             * Windowを消しても メモリにはプログラムが残ってる
             * 場合があるので 消したらメモリからも消えるように
             */

            PostQuitMessage(0);
            break;
        default:
            //Windowsに処理を任せる
            return DefWindowProc(hWnd, msg, wParam, lParam);
    }

    return 0;
}


int WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSIR cmdLine, int cmdShow)
{    
    hInstance = hInst;
    WNDCLASSEX wc;
    
    /*** WINDCLASSEX(ウィンドウ作成) の設定***/
	static LPSTR pClassName = "Test";                       // クラス名

	wc.cbSize		 = sizeof(WNDCLASSEX);				    // 構造体サイズ
	wc.style		 = CS_HREDRAW | CS_VREDRAW;			    // クラススタイル
	wc.lpfnWndProc	 = (WNDPROC)WndProc;
	wc.cbClsExtra	 = 0;							        // 不足メモリ
	wc.cbWndExtra	 = 0;							        //  のサイズ
	wc.hInstance	 = hInst;						        // インスタンス
	wc.hIcon		 = NULL;					            // アイコン
	wc.hCursor		 = LoadCursor(NULL.IDC_ARROW);			// カーソル
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);            // 背景色
	wc.lpszMenuName	 = NULL;						        // メニュー
	wc.lpszClassName = pClassName;						    // クラス名
	wc.hIconSm		 = NULL;					            // アイコン
	if (!RegisterClassEx(&wc)) return FALESE;				// 登録


    //Windowサイズ指定専用API
    //AdjustWindowRectEX -> Windowの大きさを計算するAPI
    
    RECT r;

    r.left      =   r.top  =   0;
    r.right     =   24 * 10;
    r.bottom    =   24 * 20;
 
    AdjustWindowRectEx(&r, WS_OVERLAPPED | WS_MINIMIZEBOX |
                                  WS_SYSMENU | WS_CAPTION, false, 0);


    //ウィンドウの作成
    hMainWindow = CreateWindow(pClassName, "Test", WS_OVERLAPPED | WS_MINIMIZEBOX |
                  WS_SYSMENU | WS_CAPTION, CW_USEDEFALUT, CW_USEDEFAULT, 
                  r.right - r.left, r.bottom - r.left, NULL, NULL, hInst, NULL);

    ShowWindow(hMainWindow, SW_SHOW);

    //メッセージループ
    MSG msg;
    while(GetMessage(&msg, NULL, 0,0)){
        TranslateMessage(&msg);         //キー入力を扱いやすくする
         DispatchMessage(&msg);         //関連付けられたウィンドウプロシージャへディスパッチ        
    }
    
    return 0;
}
コンパイルはBCCDeveloperだと、
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
c:\users\kai\desktop\c\tetris.cpp:
エラー E2303 c:\users\kai\desktop\c\tetris.cpp 28: 型名が必要
*** 1 errors in Compile ***

** error 1 ** deleting Debug\tetris.obj

Make End !! (Elapsed time 0:00.671)


このように表示され、
MinGWからコンパイルすると

tetris.cpp: In function 'LRESULT WndProc(HWND__*, UINT, WPARAM, LPARAM)':
tetris.cpp:21:53: error: 'IParam' was not declared in this scope
tetris.cpp: At global scope:
tetris.cpp:28:13: error: 'int WinMain' redeclared as different kind of symbol
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/winbase.h:1251:14: err
or: previous declaration of 'int WinMain(HINSTANCE__*, HINSTANCE__*, CHAR*, int)
'
tetris.cpp:28:13: error: 'HINSRANCE' was not declared in this scope
tetris.cpp:28:30: error: 'HINSRANCE' was not declared in this scope
tetris.cpp:28:51: error: 'LPSIR' was not declared in this scope
tetris.cpp:28:66: error: expected primary-expression before 'int'

このように表示されます。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ウィンドウ作成

#2

投稿記事 by みけCAT » 14年前

スペルミスですね。
HINSRANCE→HINSTANCE
LPSIR→LPSTR
でしょう。

追記
ほかの原因もあるかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

x_kai
記事: 29
登録日時: 14年前
連絡を取る:

Re: ウィンドウ作成

#3

投稿記事 by x_kai » 14年前

みけCAT さんが書きました:スペルミスですね。
HINSRANCE→HINSTANCE
LPSIR→LPSTR
でしょう。
HINSRANCEと検索しても見つからなかったのですが、
LPSIRはあったので訂正しておきました。

訂正したあとコンパイルしてみると。

BCC:
> C:\borland\bcc55\Bin\make.exe -fDebug\tetris.mak TARGET
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
bcc32 -W -3 -Od -w- -AT -pc -H- -k -b -v -y -DDEBUG -nDebug -c C:\Users\kai\Desktop\c\tetris.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
c:\users\kai\desktop\c\tetris.cpp:
エラー E2356 c:\users\kai\desktop\c\tetris.cpp 29: '__stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int)' の再宣言で型が一致していない
エラー E2344 C:\borland\bcc55\Include\winbase.h 1267: 一つ前の '__stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int)' の定義位置
エラー E2294 c:\users\kai\desktop\c\tetris.cpp 42: . または .* の左側に構造体が必要(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
エラー E2121 c:\users\kai\desktop\c\tetris.cpp 42: 関数呼び出しに ) がない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
エラー E2451 c:\users\kai\desktop\c\tetris.cpp 46: 未定義のシンボル FALESE(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
エラー E2451 c:\users\kai\desktop\c\tetris.cpp 65: 未定義のシンボル CW_USEDEFALUT(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
エラー E2451 c:\users\kai\desktop\c\tetris.cpp 71: 未定義のシンボル msg(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
*** 7 errors in Compile ***

** error 1 ** deleting Debug\tetris.obj

Make End !! (Elapsed time 0:00.593)


MinGW:
tetris.cpp: In function 'LRESULT WndProc(HWND__*, UINT, WPARAM, LPARAM)':
tetris.cpp:21:53: error: 'IParam' was not declared in this scope
tetris.cpp: At global scope:
tetris.cpp:28:13: error: 'int WinMain' redeclared as different kind of symbol
c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/winbase.h:1251:14: err
or: previous declaration of 'int WinMain(HINSTANCE__*, HINSTANCE__*, CHAR*, int)
'
tetris.cpp:28:13: error: 'HINSRANCE' was not declared in this scope
tetris.cpp:28:30: error: 'HINSRANCE' was not declared in this scope
tetris.cpp:28:51: error: 'LPSIR' was not declared in this scope
tetris.cpp:28:66: error: expected primary-expression before 'int'

アバター
tk-xleader
記事: 158
登録日時: 14年前
連絡を取る:

Re: ウィンドウ作成

#4

投稿記事 by tk-xleader » 14年前

int WINAPI WinMain(HINSTANCE .....
ではないでしょうか。

アバター
HolyWings
記事: 12
登録日時: 14年前

Re: ウィンドウ作成

#5

投稿記事 by HolyWings » 14年前

間違っているところを指摘しておきます。
x_kai さんが書きました:int WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSIR cmdLine, int cmdShow)
int WinMain → int WINAPI WinMain
x_kai さんが書きました: //ウィンドウの作成
hMainWindow = CreateWindow(pClassName, "Test", WS_OVERLAPPED | WS_MINIMIZEBOX |
WS_SYSMENU | WS_CAPTION, CW_USEDEFALUT, CW_USEDEFAULT,
r.right - r.left, r.bottom - r.left, NULL, NULL, hInst, NULL);
CW_USEDEFALUT → CW_USEDEFAULT
x_kai さんが書きました: if (!RegisterClassEx(&wc)) return FALESE;
FALESE → FALSE

x_kai
記事: 29
登録日時: 14年前
連絡を取る:

Re: ウィンドウ作成

#6

投稿記事 by x_kai » 14年前

間違ってる箇所のしてきありがとうございます。
編集後ソース:

コード:

#include <windows.h>

// グローバル変数
HWND hMainWindow;
HINSTANCE hInstance;

//ウィンドウプロシージャ作成
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg){
        case WM_DESTROY:
            /*
             * Windowを消しても メモリにはプログラムが残ってる
             * 場合があるので 消したらメモリからも消えるように
             */

            PostQuitMessage(0);
            break;
        default:
            //Windowsに処理を任せる
            return DefWindowProc(hWnd, msg, wParam, lParam);
    }

    return 0;
}


int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdLine, int cmdShow)
{    
    hInstance = hInst;
    WNDCLASSEX wc;
    
    /*** WINDCLASSEX(ウィンドウ作成) の設定***/
	static LPSTR pClassName = "Test";                       // クラス名

	wc.cbSize		 = sizeof(WNDCLASSEX);				    // 構造体サイズ
	wc.style		 = CS_HREDRAW | CS_VREDRAW;			    // クラススタイル
	wc.lpfnWndProc	 = (WNDPROC)WndProc;
	wc.cbClsExtra	 = 0;							        // 不足メモリ
	wc.cbWndExtra	 = 0;							        //  のサイズ
	wc.hInstance	 = hInst;						        // インスタンス
	wc.hIcon		 = NULL;					            // アイコン
	wc.hCursor		 = LoadCursor(NULL.IDC_ARROW);			// カーソル
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);            // 背景色
	wc.lpszMenuName	 = NULL;						        // メニュー
	wc.lpszClassName = pClassName;						    // クラス名
	wc.hIconSm		 = NULL;					            // アイコン
	if (!RegisterClassEx(&wc)) return FALSE;				// 登録


    //Windowサイズ指定専用API
    //AdjustWindowRectEX -> Windowの大きさを計算するAPI
    
    RECT r;

    r.left      =   r.top  =   0;
    r.right     =   24 * 10;
    r.bottom    =   24 * 20;
 
    AdjustWindowRectEx(&r, WS_OVERLAPPED | WS_MINIMIZEBOX |
                                  WS_SYSMENU | WS_CAPTION, false, 0);


    //ウィンドウの作成
    hMainWindow = CreateWindow(pClassName, "Test", WS_OVERLAPPED | WS_MINIMIZEBOX |
                  WS_SYSMENU | WS_CAPTION, CW_USEDEFAULT, CW_USEDEFAULT, 
                  r.right - r.left, r.bottom - r.left, NULL, NULL, hInst, NULL);

    ShowWindow(hMainWindow, SW_SHOW);


    //メッセージループ
    MSG msg;
    while(GetMessage(&msg, NULL, 0,0)){
        TranslateMessage(&msg);         //キー入力を扱いやすくする
         DispatchMessage(&msg);         //関連付けられたウィンドウプロシージャへディスパッチ        
    }
    
    return 0;
}
このようになりました。
ですが、まだエラーがでてコンパイルできません。。

BCC:
エラー E2294 c:\users\kai\desktop\c\tetris.cpp 42: . または .* の左側に構造体が必要(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
エラー E2121 c:\users\kai\desktop\c\tetris.cpp 42: 関数呼び出しに ) がない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
エラー E2451 c:\users\kai\desktop\c\tetris.cpp 71: 未定義のシンボル msg(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
*** 3 errors in Compile ***

** error 1 ** deleting Debug\tetris.obj


MinGW:
tetris.cpp: In function 'int WinMain(HINSTANCE__*, HINSTANCE__*, CHAR*, int)':
tetris.cpp:34:28: warning: deprecated conversion from string constant to 'CHAR*'

tetris.cpp:43:33: error: expected unqualified-id before '(' token
tetris.cpp:43:33: error: expected primary-expression before ')' token

アバター
tk-xleader
記事: 158
登録日時: 14年前
連絡を取る:

Re: ウィンドウ作成

#7

投稿記事 by tk-xleader » 14年前

LoadCursor(NULL.IDC_ARROW) → LoadCursor(NULL,IDC_ARROW)

のミスです。

x_kai
記事: 29
登録日時: 14年前
連絡を取る:

Re: ウィンドウ作成

#8

投稿記事 by x_kai » 14年前

tkmakwins15 さんが書きました:LoadCursor(NULL.IDC_ARROW) → LoadCursor(NULL,IDC_ARROW)

のミスです。
そのとおりでした!
早速コンパイルしてみたところ。。

BCC
エラー E2451 c:\users\kai\desktop\c\tetris.cpp 71: 未定義のシンボル msg(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
*** 1 errors in Compile ***

** error 1 ** deleting Debug\tetris.obj

Make End !! (Elapsed time 0:00.655)


MinGW
tetris.cpp: In function 'int WinMain(HINSTANCE__*, HINSTANCE__*, CHAR*, int)':
tetris.cpp:34:28: warning: deprecated conversion from string constant to 'CHAR*'

このように表示されました..ホント無知ですみません。

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: ウィンドウ作成

#9

投稿記事 by bitter_fox » 14年前

x_kai さんが書きました:
tkmakwins15 さんが書きました:LoadCursor(NULL.IDC_ARROW) → LoadCursor(NULL,IDC_ARROW)

のミスです。
そのとおりでした!
早速コンパイルしてみたところ。。
エラー E2451 c:\users\kai\desktop\c\tetris.cpp 71: 未定義のシンボル msg(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) )
*** 1 errors in Compile ***
このように表示されました..ホント無知ですみません。
2011年8月16日(火) 10:33 投稿のコードのLoadCursor(NULL.IDC_ARROW)の部分を修正してコンパイルしたところエラーは表示されませんでした。

x_kaiさんがコンパイルしたコードと見比べてみてください、またこのコードでもコンパイルエラーが表示されてしまいますか?

コード:

#include <windows.h>
 
// グローバル変数
HWND hMainWindow;
HINSTANCE hInstance;
 
//ウィンドウプロシージャ作成
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg){
        case WM_DESTROY:
            /*
             * Windowを消しても メモリにはプログラムが残ってる
             * 場合があるので 消したらメモリからも消えるように
             */
 
            PostQuitMessage(0);
            break;
        default:
            //Windowsに処理を任せる
            return DefWindowProc(hWnd, msg, wParam, lParam);
    }
 
    return 0;
}
 
 
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdLine, int cmdShow)
{    
    hInstance = hInst;
    WNDCLASSEX wc;
    
    /*** WINDCLASSEX(ウィンドウ作成) の設定***/
    static LPSTR pClassName = "Test";                       // クラス名
 
    wc.cbSize        = sizeof(WNDCLASSEX);                  // 構造体サイズ
    wc.style         = CS_HREDRAW | CS_VREDRAW;             // クラススタイル
    wc.lpfnWndProc   = (WNDPROC)WndProc;
    wc.cbClsExtra    = 0;                                   // 不足メモリ
    wc.cbWndExtra    = 0;                                   //  のサイズ
    wc.hInstance     = hInst;                               // インスタンス
    wc.hIcon         = NULL;                                // アイコン
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);          // カーソル
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);            // 背景色
    wc.lpszMenuName  = NULL;                                // メニュー
    wc.lpszClassName = pClassName;                          // クラス名
    wc.hIconSm       = NULL;                                // アイコン
    if (!RegisterClassEx(&wc)) return FALSE;                // 登録
 
 
    //Windowサイズ指定専用API
    //AdjustWindowRectEX -> Windowの大きさを計算するAPI
    
    RECT r;
 
    r.left      =   r.top  =   0;
    r.right     =   24 * 10;
    r.bottom    =   24 * 20;
 
    AdjustWindowRectEx(&r, WS_OVERLAPPED | WS_MINIMIZEBOX |
                                  WS_SYSMENU | WS_CAPTION, false, 0);
 
 
    //ウィンドウの作成
    hMainWindow = CreateWindow(pClassName, "Test", WS_OVERLAPPED | WS_MINIMIZEBOX |
                  WS_SYSMENU | WS_CAPTION, CW_USEDEFAULT, CW_USEDEFAULT, 
                  r.right - r.left, r.bottom - r.left, NULL, NULL, hInst, NULL);
 
    ShowWindow(hMainWindow, SW_SHOW);
 
 
    //メッセージループ
    MSG msg;
    while(GetMessage(&msg, NULL, 0,0)){
        TranslateMessage(&msg);         //キー入力を扱いやすくする
         DispatchMessage(&msg);         //関連付けられたウィンドウプロシージャへディスパッチ        
    }
    
    return 0;
}

x_kai
記事: 29
登録日時: 14年前
連絡を取る:

Re: ウィンドウ作成

#10

投稿記事 by x_kai » 14年前

>> x_kaiさんがコンパイルしたコードと見比べてみてください、またこのコードでもコンパイルエラーが表示されてしまいますか?

コンパイルしてみましたが、同じエラーが返ってきました。

閉鎖

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