Windowsプログラムを勉強しています

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

Windowsプログラムを勉強しています

#1

投稿記事 by マイマイ » 8年前

はじめまして。

マイクロソフトのVCを使ってC言語でウィンドウの作成を行おうと思うのですが、エラーがとれません。

どうすれば動くんでしょうか?

OS:Windows7

Visual C++ 2008 Express を使っています

ライブラリとかは使ってません。


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <windows.h>

HINSTANCE hInstance;
HWND hMainWindow;

//ウィンドウプロシージャ関数のプロトタイプ宣言
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
switch(msg){
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdLine, int cmdShow){
hInstance = hInst;
WNDCLASSEX wc;
static LPSTR pClassName = "Window";

//ウィンドウ・クラス設定
wc.cbSize = sizeof(WNDCLASSEX); //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;

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, "Window", WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION, CW_USEDEFAULT, CW_USEDEFAULT, r.right - r.left, r.bottom - r.top, NULL, NULL, hInst, NULL);

ShowWindow(hMainWindow, SW_SHOW);

//メッセージループ
MSG msg;
while(GetMessage(&msg, NULL, 0, 0)){ //メッセージ取得
TranslateMessage(&msg); //メッセージの変換
DispatchMessage(&msg); //メッセージを送る
}

return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//2つのエラーが出ます↓

: error C2440: '=' : 'LPSTR' から 'LPCWSTR' に変換できません。
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

error C2664: 'CreateWindowExW' : 2 番目の引数を 'LPSTR' から 'LPCWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です

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

Re: Windowsプログラムを勉強しています

#2

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

なぜかUNICODEを使う設定になっているようです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

マイマイ

Re: Windowsプログラムを勉強しています

#3

投稿記事 by マイマイ » 8年前

どの部分を言っているのですか?

申し訳ありませんが勉強したてであまり用語に詳しくありません。

もう少しわかりやすくお願いします。

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

Re: Windowsプログラムを勉強しています

#4

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

VCにはあまり詳しくないのですが、
「プロジェクトの設定」で「マルチバイト文字を使う」のような設定にしてください。

・・・他の方解説お願いします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Suikaba
記事: 194
登録日時: 9年前

Re: Windowsプログラムを勉強しています

#5

投稿記事 by Suikaba » 8年前

楽したいなら、
#include<windows.h>
のあとに
#include <tchar.h>
として、
INT WINAPI _tWinMain( HINSTANCE hInst, HINSTANCE, LPTSTR, int )
{
}
とすればよかったはずです。

それか、wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, int )
でいけると思います。

それと、2つめのエラーですが、自分は
#include <tchar.h>
typedef std::basic_string<TCHAR> tstring;
として、
tstring pClassName(L"class name");
wc.lpszClassName = pClassName.c_str(); //ウィンドウクラス名
としています。(Unicode環境)

non
記事: 1097
登録日時: 9年前

Re: Windowsプログラムを勉強しています

#6

投稿記事 by non » 8年前

メニューのプロジェクトから1番下のプロパティ
左側の構成プロパティを選んで、文字セットを「マルチ バイト文字セットを使用する」に変更する。
non

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

Re: Windowsプログラムを勉強しています

#7

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

non さんが書きました:メニューのプロジェクトから1番下のプロパティ
左側の構成プロパティを選んで、文字セットを「マルチ バイト文字セットを使用する」に変更する。
俺が言いたかったのは(多分)これです!
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

マイマイ

Re: Windowsプログラムを勉強しています

#8

投稿記事 by マイマイ » 8年前

nonさん、みけさんのアドバイスで解決しました!

他の方々も本当にありがとうございました!

閉鎖

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