ぷろぐらみんぐ日和 -13ページ目

HELP!wndowsAPI!

今現在WindowsAPIで作っているものは、

簡単なデスクトップアプリなんですが…

これが完成しないとタイマーの次に進めないではないですか!!(精神的に)


過去のC言語の産物、占いとラッキーカラーと搭載して

時計をつけたデスクトップアプリ(のつもり)です。

まだメニューなどはつけてないので、頭がこんがらがってめちゃくちゃです。


一応コンパイルには成功したのですが…

プログラムが起動しません。

コンパイルエラーではない何かがエラーになっているのだと思います。

このエラーはプログラミング中の初の自分にとっての不明のエラーです。


下のコード見て、

起動しない理由が分かる方コメントにてお願いします。

ちなみにいろいろ修正してみて現在はエラーまみれになってしまいました。

いろいろ心当たりがあるのですか、まだ習ってないところも試行錯誤しながらやっているので。

特に占いとラッキーカラーが心配です(またか)。


#include <windows.h>
#include <time.h>
#define ID_MYTIMER 100

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
HFONT MyCreateFont(int,DWORD, LPCTSTR);

char szClassName[] = "windows";


int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
LPSTR lpsCmdLine, int nCmdShow)
{
MSG msg;
BOOL bRet;

if (!InitApp(hCurInst))
return FALSE;
if (!InitInstance(hCurInst, nCmdShow))
return FALSE;
while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
if (bRet == -1) {
break;
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}


ATOM InitApp(HINSTANCE hInst)
{
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = (HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hCursor = (HCURSOR)LoadImage(NULL,
MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = (LPCSTR)szClassName;
wc.hIconSm = (HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);

return (RegisterClassEx(&wc));
}


BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
{
HWND hWnd;

hWnd = CreateWindow(szClassName,
"デスクトップアクセサリー",
WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX,
CW_USEDEFAULT,
CW_USEDEFAULT,

500,
400,
NULL,

NULL,

hInst,
NULL);
if (!hWnd)
return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
int id, iOldMode, color;
char *uranai;
HDC hdc;
PAINTSTRUCT ps;
SYSTEMTIME st;
HFONT hFont1, hFont2;
HPEN hPen, hOldPen;
HBRUSH hBrush, hOldBrush;
COLORREF crOldColor;
RECT rc, rc1 = {40, 50, 460, 360}, rc2 = {40, 70, 460, 360};

static char szTime[64], szDate[64];
//タイトル
char *title = "デスストップアクセサリ";
//説明文
char *setu = "このデスクトップアクセサリは現在のシステム時刻、\n占い、ラッキーカラー、簡単なゲームアプリです。\n";

switch (msg) {
case WM_CREATE:
SetTimer(hWnd, ID_MYTIMER, 500, NULL);
srand((unsigned int) time(0));
hFont1 = MyCreateFont(50, SHIFTJIS_CHARSET, "HG行書体");

color = rand() % 13;
switch(color){
case 1 :
char *hantei = "赤";
break;
case 2 :
char *hantei = "青";
break;
case 3 :
char *hantei = "黄";
break;
case 4 :
char *hantei = "桃";
break;
case 5 :
char *hantei = "緑";
break;
case 6 :
char *hantei = "紫";
break;
case 7 :
char *hantei = "黒";
break;
case 8 :
char *hantei = "白";
break;
case 9 :
char *hantei = "金";
break;
case 10 :
char *hantei = "銀";
break;
case 11 :
char *hantei = "橙";
break;
case 12 :
char *hantei = "水色";
break;
case 13 :
char *hantei = "黄緑";
break;
default :
char *hantei = "エラー";
break;
}

break;
case WM_TIMER:
if (wp != ID_MYTIMER)
return (DefWindowProc(hWnd, msg, wp, lp));
GetLocalTime(&st);
wsprintf(szTime, "%02d:%02d:%02d", st.wHour,
st.wMinute, st.wSecond);
wsprintf(szDate, "%d年%02d月%02d日", st.wYear,
st.wMonth, st.wDay);
InvalidateRect(hWnd, NULL, TRUE);

break;

case WM_LBUTTONDBLCLK:
SendMessage(hWnd, WM_CLOSE, 0, 0);
break;

case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
GetClientRect(hWnd, &rc);

hPen = CreatePen(PS_NULL, 0, RGB(0, 0, 0));
hOldPen = (HPEN)SelectObject(hdc, hPen);
hBrush = CreateSolidBrush(RGB(140, 200, 255));
hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);
RoundRect(hdc, 20, 40, 460, 360, 10, 10);

crOldColor = SetTextColor(hdc, RGB(0, 0, 255));

TextOut(hdc,20,0,szDate,
(int)strlen(szDate));
TextOut(hdc,20,20,szTime,
(int)strlen(szTime));


SelectObject(hdc, hFont1);
DrawText(hdc, (LPCTSTR)title, -1, &rc1, DT_CENTER);
iOldMode = SetBkMode(hdc, TRANSPARENT);

DeleteObject(hFont1);
DrawText(hdc, setu, -1, &rc2, DT_CENTER | DT_WORDBREAK);

DeleteObject(hPen);
DeleteObject(hBrush);
//環境を元に戻しておく
SelectObject(hdc, hOldPen);
SelectObject(hdc, hOldBrush);
SetTextColor(hdc, crOldColor);
SetBkMode(hdc, iOldMode);

color = rand() % 10;
switch(color)
{
case 1 :
wsprintf(uranai,"今日は何をやってもハッピーな一日となるでしょう。\nラッキーカラーは%cです。",hantei);
DrawText(hdc, (LPCTSTR)uranai, -1, &rc, DT_CENTER | DT_WORDBREAK);

break;
case 2 :
wsprintf(uranai,"今日は何をやってもハッピーな一日となるでしょう。\nラッキーカラーは%cです。",hantei);
DrawText(hdc, (LPCTSTR)hantei, -1, &rc, DT_CENTER | DT_WORDBREAK);

break;
case 3 :
wsprintf(uranai,"今日は何をやってもハッピーな一日となるでしょう。\nラッキーカラーは%cです。",hantei);
DrawText(hdc, (LPCTSTR)hantei, -1, &rc, DT_CENTER | DT_WORDBREAK);

break;
case 4 :
wsprintf(uranai,"今日は何をやってもハッピーな一日となるでしょう。\nラッキーカラーは%cです。",hantei);
DrawText(hdc, (LPCTSTR)hantei, -1, &rc, DT_CENTER | DT_WORDBREAK);

break;
case 5 :
wsprintf(uranai,"今日は何をやってもハッピーな一日となるでしょう。\nラッキーカラーは%cです。",hantei);
DrawText(hdc, (LPCTSTR)hantei, -1, &rc, DT_CENTER | DT_WORDBREAK);

break;
case 6 :
wsprintf(uranai,"今日は何をやってもハッピーな一日となるでしょう。\nラッキーカラーは%cです。",hantei);
DrawText(hdc, (LPCTSTR)hantei, -1, &rc, DT_CENTER | DT_WORDBREAK);

break;
case 7 :
wsprintf(uranai,"今日は何をやってもハッピーな一日となるでしょう。\nラッキーカラーは%cです。",hantei);
DrawText(hdc, (LPCTSTR)hantei, -1, &rc, DT_CENTER | DT_WORDBREAK);

break;
case 8 :
wsprintf(uranai,"今日は何をやってもハッピーな一日となるでしょう。\nラッキーカラーは%cです。",hantei);
DrawText(hdc, (LPCTSTR)hantei, -1, &rc, DT_CENTER | DT_WORDBREAK);

break;
case 9 :
wsprintf(uranai,"今日は何をやってもハッピーな一日となるでしょう。\nラッキーカラーは%cです。",hantei);
DrawText(hdc, (LPCTSTR)hantei, -1, &rc, DT_CENTER | DT_WORDBREAK);

break;
case 10 :
wsprintf(uranai,"今日は何をやってもハッピーな一日となるでしょう。\nラッキーカラーは%cです。",hantei);
DrawText(hdc, (LPCTSTR)hantei, -1, &rc, DT_CENTER | DT_WORDBREAK);

break;
default :
wsprintf(uranai,"エラーです。",hantei);
DrawText(hdc, (LPCTSTR)hantei, -1, &rc, DT_CENTER | DT_WORDBREAK);
break;
}

EndPaint(hWnd, &ps);
break;
case WM_CLOSE:
id = MessageBox(hWnd,
"終了してもよろしいですか",
"確認",
MB_YESNO | MB_ICONQUESTION);
if (id == IDYES) {
if (KillTimer(hWnd, ID_MYTIMER) == 0) {
MessageBox(hWnd, "KillTimer Error!", "Error", MB_OK | MB_ICONEXCLAMATION);
}
DestroyWindow(hWnd);
}
break;
case WM_DESTROY:
DeleteObject(hFont1);
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}

HFONT MyCreateFont(int nHeight,DWORD dwCharSet, LPCTSTR lpText)
{
return(CreateFont(nHeight, 0,0,0,
FW_DONTCARE,
FALSE, FALSE, FALSE,
dwCharSet,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH | FF_DONTCARE,
lpText)
);

}


こんな表現もあるよ、こんな風に短縮できるよ、とか教えていただければ幸いです。


◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇


最近のプログラミング関連の記事

windowsプログラミング状況。

C++の基本学習終了。

C言語開発環境の紹介。

見やすくするためにルーム改造。

雨風呂のアクセスアップブログの琉海@ブログアクセスアップ戦術143 を見ていたところ、

ルームで怪しいか怪しくないかの判断がされてしまうということで、

自分のルームを確認してみたところ…

あちゃ~、これじゃぺタをしたときぺタ返しされないわけだ!と思わず思ってしまいました。


と言うわけで文章を書き加えたり、

背景画像を設定してみたりして、スタイリッシュなルームにカスタマイズしてみました。


http://profile.ameba.jp/programlanguage/


ブログの内容を具体的に、

どんなコンテンツがあるのかを細かく説明をしています。


上のルームはちょっとさっきまで、殆ど白で自己紹介さえも無く、

アメーバのユーザーから見れば、

「ファイルの画像をプロフィール画像に設定している不気味なユーザーが足跡を残してきた」

と思われてしまっていたのではないかと思います。


そして皆さんに聞きたいことが…


リンクがリンクとして認識されていない場合があると言うことなので…

このブログのリンクは、リンクとして認識されていますか?


ちなみにリンク色は

リンクテスト

となっています。


このリンク色はブログのデザイン上リンク色を変更しなければならなかったのですが、

ちゃんとリンクとして認識されているのでしょうか?


◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇


最近のプログラミング関連の記事

windowsプログラミング状況。

C++の基本学習終了。

C言語開発環境の紹介。

プログラム学習の合間に。

windowsAPIの学習が全く進まない中で、

プラウザソフトの変更を楽しんでみました。


切欠はInternetExplorer8にアップデートして、

適当にアドオンを閲覧中に発見したフリーソフト

SnapCrab 」をダウンロードしてみて、IE8では使えないことが発覚したので、

フェンリルのインターネットプラウザ「Grani 」を使用してみたこと。


InternetExplorer以外は使用したことが無いので、

説明などを少しずつ確認しました。


このプラウザ「Grani 」はプラウザ自体のデザインを変更できる機能がついていて、

公式サイトにてスキンが十数種あり、

デザインスキン自体に数は豊富ではないものの、

自分の気に入るデザインがあったので簡単にスキンを変更。


ぷろぐらみんぐ日和
デザインテンプレートbrillant-cyanのイメージ


マウスジェスチャ機能もついており右クリック+マウスの移動方向で、

簡単にいろいろな操作を可能にします。


さっき慣れていない中、記事を執筆中に新しくタブを開こうとして、

↑↓と操作したところ、実際にはタブを開く操作は↓で、

最新の情報に更新されてしまい記事が書き直しになってしまいました。

マウスジェスチャの使用にはもっと練習が必要みたいです。


そのほかにもIEでは無いような機能が拡張されており、

使い道があります。


フリーソフトなので機会があれば使ってみてください。

更新が滞っております。

最近更新してないのはスミマセン。


プログラミング状況がタイマーから先に進展していないもので。


どのくらい理解できれば先に進んでいいのかよく分からないので、


完璧に理解するまで(出てきた関数の使用法など)しています。


「ある程度理解してその関数を使いたいときだけヘルプする」という


方法もあるみたいなんですが、しっかり理解しないと安心しませんので。

windowsプログラミング状況。

ちょっと前にwindowsプログラミングをしていたのですが、


まだ理解力が足りないのでは?ということでC++の基礎をある程度終わらせて、


windowsに移行してみたものの…まぁいろいろあってあまりやる時間無いんです。


久しぶりにやるので、


テキストを表示させるすべさえも忘れているかもしれません。


まずウィンドウを表示させるプログラムは毎回コピペ。


#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);

char szClassName[] = "windows";


int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
LPSTR lpsCmdLine, int nCmdShow)
{
MSG msg;
BOOL bRet;

if (!InitApp(hCurInst))
return FALSE;
if (!InitInstance(hCurInst, nCmdShow))
return FALSE;
while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
if (bRet == -1) {
break;
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}


ATOM InitApp(HINSTANCE hInst)
{
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = (HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hCursor = (HCURSOR)LoadImage(NULL,
MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = (LPCSTR)szClassName;
wc.hIconSm = (HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);

return (RegisterClassEx(&wc));
}


BOOL InitInstance(HINSTANCE hInst, int nCmdShow)
{
HWND hWnd;

hWnd = CreateWindow(szClassName,
"ウィンドウ",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,

CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,

NULL,

hInst,
NULL);
if (!hWnd)
return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}


LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
PAINTSTRUCT ps;
char *text = "テキストテスト";
HDC hdc;

switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd,&ps);
TextOut(hdc, 10,10,(LPCTSTR)text,(int)strlen(text));
EndPaint(hWnd,&ps);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}


完全に忘れてた…


本を読み直して思い出しました。


これは最初からやり直しですな。


毎回.exeはうpしません。