FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

使い勝手向上版MessageBox関数

WinAPIを使用したプログラミングをする方なら
バグ探しに重宝しているであろう。

MessageBox関数

今回はこのMessageBox関数を改修して、利便性向上を図ったものを紹介。

注)私が気付いてないバグが有るかもしれません。
 使用する場合は自己責任でお願いします。

例の如く続きから。

関数のプロトタイプ宣言をしているヘッダーファイルです。

・ヘッダーファイル<NewMsgBox.h>
#ifndef _NEWMSGBOX_
#define _NEWMSGBOX_

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <windows.h>

#pragma once /*Visual C++ コンパイラ独自のプリプロセッサです。*/

int NewMsgBoxW(HWND hWnd,UINT uType,LPCWSTR lpCaption,LPCWSTR lpText,...);
int NewMsgBoxA(HWND hWnd,UINT uType,LPCSTR lpCaption,LPCSTR lpText,...);

#ifdef UNICODE
#define NewMsgBox NewMsgBoxW
#else
#define NewMsgBox NewMsgBoxA
#endif /*UNICODE*/

#endif /*_NEWMSGBOX_*/
NewMsgBoxW関数はユニコード版です。
NewMsgBoxA関数はアスキー版です。
どちらもNewMsgBoxと打てばプリプロセッサが自動で判別。
適切な関数を選択してくれます。

次に、関数の本体のソースファイルです。

・ソースファイル<NewMsgBox.c>
#include"NewMsgBox.h"

int NewMsgBoxW(HWND hWnd,UINT uType,LPCWSTR lpCaption,LPCWSTR lpText,...)
{
va_list al;
int length=0,nRtn=0;
wchar_t *pStr=NULL;

va_start(al,lpText);
length=_vscwprintf(lpText,al)+1;
pStr=(wchar_t *)calloc(length,sizeof(wchar_t));
if(pStr==NULL){
va_end(al);
return(0);
}
vswprintf_s(pStr,length,lpText,al);
va_end(al);
nRtn=MessageBoxW(hWnd,pStr,lpCaption,uType);
if(pStr)free(pStr);
return(nRtn);
}

int NewMsgBoxA(HWND hWnd,UINT uType,LPCSTR lpCaption,LPCSTR lpText,...)
{
va_list al;
int length=0,nRtn=0;
char *pStr=NULL;

va_start(al,lpText);
length=_vscprintf(lpText,al)+1;
pStr=(char *)calloc(length,sizeof(char));
if(pStr==NULL){
va_end(al);
return(0);
}
vsprintf_s(pStr,length,lpText,al);
va_end(al);
nRtn=MessageBoxA(hWnd,pStr,lpCaption,uType);
if(pStr)free(pStr);
return(nRtn);
}

・テストアプリのソースコード
#include<windows.h>

#include"NewMsgBox.h"

int WINAPI WinMain(HINSTANCE hCurInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nCmdShow)
{
NewMsgBox(NULL,MB_OK,TEXT("Hello Test"),TEXT("Hello Test %d"),1234);
return 0;
}

・実行結果
NewMsgBox関数の実行結果画像
おっと綴りを間違えたw。
Hellow TestじゃなくHello Testが正しい。
ソースは修正した。ぶっちゃけ、スクショ取り直すの面倒だ。


・関数説明

NewMsgBoxW関数/NewMsgBoxA関数
int NewMsgBox(
HWND hWnd, //ウインドウハンドルを指定
UINT uType, //メッセージボックスのスタイルを指定
LPCTSTR lpCaption, //タイトル文字列
LPCTSTR lpText, //メッセージ本文と追加書式
... //メッセージ本文にある追加書式に対応した変数を指定
);
追加書式とは、printf関数などで
printf("Number->%d\nString->",10,"ABCD");
とすれば
Number->10
String->ABCD
と表示される様な書式です。正しい用語じゃないですよ。

取り敢えず、この関数を使用すれば、気になる関数の戻り値がすぐに解ります。
あとは皆さんで勝手に弄繰り回して、自分に合う関数に仕上げましょう。
結局のところwsprintf関数とMessageBox関数を複合化しただけの関数です。

使用方法はNewMsgBox.hとNewMsgBox.cをプロジェクトに参加させればOKです。
または、コンパイラー、リンカーにNewMsgBox.hとNewMshBox.cを指定して。

64bit版の場合は戻り値の型とかがintでなく、INT_PTRになるので注意。
この辺は64bitアプリ開発したこと無いので良くわかりませんけど(^^;

tema:プログラミング - Genre:コンピュータ

  1. 2010/09/22(水) 00:01:30|
  2. プログラミング
  3. | Track back:0
  4. | Comment:0

Comment

Post a comment

Only display to administrator.

Track back

Track Back URL
Track Back to this post(FC2 blog user)