質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2389閲覧

VC++でウィンドウを作って表示するプログラムを作りたいのですが…

ofu

総合スコア11

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/01/04 12:02

編集2016/01/04 12:04

すみません、VC++のwin32で、次のようにウィンドウを作成して表示するプログラムを作ったのですが、

#ifndef UNICODE
#define UNICODE
#endif

#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{
const wchar_t classnm1[] = L"wincla1";

WNDCLASSEX winhon1 = { sizeof(WNDCLASSEX), CS_HREDRAW|CS_VREDRAW, DefWindowProc, 0, 0, hInstance, NULL, LoadCursor(NULL,IDC_ARROW), (HBRUSH)RGB(255,255,255), NULL, classnm1, NULL }; RegisterClassEx(&winhon1); MSG massagen = {}; HWND hwnd = CreateWindowEx( 0, classnm1, L"wincla1", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); if (hwnd == NULL) { return 0; } ShowWindow(hwnd,nCmdShow); while (GetMessage(&massagen,NULL, 0, 0)) { TranslateMessage(&massagen); DispatchMessage(&massagen); } return 0;

}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){

switch (uMsg) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_PAINT: PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1)); EndPaint(hwnd, &ps); return 0; } return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

なにも出てきませんでした。
エラーメッセージも表示されませんでした。
しかし、これはどうすればウィンドウを表示できるのでしょうか?

回答してくれる方、ありがとうございます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

(HBRUSH)RGB(255,255,255),

このブラシの指定がまずいようです。

(HBRUSH)GetStockObject(WHITE_BRUSH)

とすればウィンドウは表示されました。

このような時は、各関数の戻り値を見て、どこで失敗しているのか確認すると良いです。
下記コードを入れて、デバッガでブレークを張ってみてみました。

C++

1ATOM a=RegisterClassEx(&winhon1); 2DWORD d = GetLastError();

aに0が返り、GetLastError()は87を返却してました。
WinError.hを見ると、下記のようになっていましたので、パラメータ・エラーであることが分かります。

C++

1// 2// MessageId: ERROR_INVALID_PARAMETER 3// 4// MessageText: 5// 6// The parameter is incorrect. 7// 8#define ERROR_INVALID_PARAMETER 87L // dderror

ところで、ウィンドウ・プロシージャとしてDefWindowProcを指定しているのはWindowProcの間違いと思います。

後、teratailのMarkDownの書き方はここを見ると良いですよ。

投稿2016/01/04 12:36

編集2016/01/04 13:03
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ofu

2016/01/05 07:33

ありがとうございます!修正した結果ちゃんとウィンドウが表示されました! やはりブラシ(hbrBackground)の指定がまずかったんですね。 あと、デバッグ用関数について書いてくださりありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問