win32apiの豆知識

Win32 APIを勉強中もしくは、Win32APIを用いたソフトウェア開発を行っている方々のグループです。
今時、Win32 API?と思う人が多いと思いますが、MFCなどの便利なものを利用せずあえてWin32 APIで、という人にはぴったりなグループです。
Win32 APIの情報交換が出来たらいいかなと思ってます^^
フォーラム(掲示板)ルール
このようなグループですので、仲良くやって生きましょう(^^)/
返信
アバター
Cir
記事: 32
登録日時: 8年前
住所: 近畿地方

win32apiの豆知識

#1

投稿記事 by Cir » 8年前

知っていると便利な知識や面白い関数などなどを書き込むトピックです。
win32apiに関係のあるものなら何でもOKです。是非書き込んでください^^

アバター
Cir
記事: 32
登録日時: 8年前
住所: 近畿地方

Re: win32apiの豆知識

#2

投稿記事 by Cir » 8年前

ではいいだしっぺから。

BOOL DrawFrameControl( HDC hdc, LPRECT lprc, UINT uType, UINT uState );
ボタンなどのフレームコントロールの絵を描く関数です。

hdcにはデバイスコンテキスト、lprcにはコントロールの大きさの入ったRECT構造体のポインタを、uTypeにはコントロールの種類、uStateにはコントロールの状態を指定します。

簡単なサンプル

コード:

//ボタンを描く
//ボタンの絵を描いているだけなので、クリックしても何も起きません(当たり前ですが)
void DrawButton(HDC hdc, int x, int y, int width, int height)
{
	RECT rect = { x, y, x + width, y + height };
	
	//ボタンコントロールを描くにはuTypeにDFC_BUTTONを指定します。
	//他にはDFC_CAPTION(タイトルバー)、DFC_SCROLL(スクロールバー)などがあります。
	//uTypeがDFC_BUTTONの場合、DFCS_BUTTONPUSHを指定すると、プッシュボタンが描画されます。
	//他にはDFCS_BUTTONCHECK(チェックボックス)、DFCS_BUTTONRADIO(ラジオボタン)などがあります。
	DrawFrameControl(hdc, &rect, DFC_BUTTON, DFCS_BUTTONPUSH);
}
使い道は……





わかんないです^^;

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

Re: win32apiの豆知識

#3

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

これは...RADツールを作るのに使えるかな?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
Cir
記事: 32
登録日時: 8年前
住所: 近畿地方

Re: win32apiの豆知識

#4

投稿記事 by Cir » 8年前

BOOL MessageBeep( UINT uType );

システム警告音を鳴らす関数です。

uTypeには以下のサウンドタイプを指定します。
  1. -1 : コンピュータのスピーカから発生する標準的なビープ音
  2. MB_ICONASTERISK : 情報メッセージ音
  3. MB_ICONEXCLAMATION : 警告メッセージ音
  4. MB_ICONHAND : システムエラー音
  5. MB_ICONQUESTION : 問い合わせメッセージ音
  6. MB_OK : 一般の警告音
超簡単なサンプル

コード:

//一般の警告音を鳴らす
MessageBeep( MB_OK );

アバター
Cir
記事: 32
登録日時: 8年前
住所: 近畿地方

Re: win32apiの豆知識

#5

投稿記事 by Cir » 8年前

もういっちょ!
Beep( DWORD dwFreq, DWORD dwDuration );

ビープ音を再生します。

dwFreqには音の周波数(Hz)を、dwDurationには音の持続時間(ms)をそれぞれ指定します。
ただし、これらの引数はWin9x系のOSでは無視されます。(←確認できていません)

この関数は同期実行されます。

超簡単なサンプル

コード:

//ドの音を1秒間再生する
//ド→440Hz
//1s→1000ms
Beep(440, 1000);

taketoshi
記事: 221
登録日時: 8年前
住所: 日本国

Re: win32apiの豆知識

#6

投稿記事 by taketoshi » 8年前

モスキート音アプリが作れそう!

アバター
Cir
記事: 32
登録日時: 8年前
住所: 近畿地方

Re: win32apiの豆知識

#7

投稿記事 by Cir » 8年前

>みけCAT さん
おおぉっ、そのような使い方が!他にも自作コントロールにも使えそうですね。

>taketoshi さん
耳年齢測定アプリなどですね!しかしあの音、長時間聞き続けていると気持ち悪くなってくるんですよね…。

アバター
Cir
記事: 32
登録日時: 8年前
住所: 近畿地方

Re: win32apiの豆知識

#8

投稿記事 by Cir » 8年前

BOOL PathRemoveFileSpec(LPTSTR pszPath);
パスからファイル名を取り除きます。

pszPathには最大長MAX_PATHの、NULL文字で終了するパスを指定します。
ファイル名を取り除いたら1以外を、取り除かなかった場合は0を返します。
この関数を使用するには、「shlwapi.h」をインクルードし、「shlwapi.lib」を追加してください。

超簡単なサンプル

コード:

#include <stdio.h>
#include <shlwapi.h>

#pragma comment(lib, "shlwapi.lib")

int main(int argc, char **argv)
{
	char path[] = "hoge\\fuga\\piyo.dat";
	
	printf("before:%s\n", path);
	
	//パスからファイル名を取り除く
	PathRemoveFileSpec(path);
	
	printf("after:%s\n", path);
	
	return 0;
}
	

taketoshi
記事: 221
登録日時: 8年前
住所: 日本国

Re: win32apiの豆知識

#9

投稿記事 by taketoshi » 8年前

>>Cirさん
おお、このAPI便利だ。
iniファイルなんかを作るときパス名が必要ですが
今まで_splitpathで細切れにしてからstrncatで再結合していました。


ナイス情報です。

アバター
Cir
記事: 32
登録日時: 8年前
住所: 近畿地方

Re: win32apiの豆知識

#10

投稿記事 by Cir » 8年前

void PathRemoveExtension(LPTSTR path);
パスから拡張子を取り除きます。
pathには拡張子を取り除きたい、NULL文字列で終了する文字列を指定します。
この関数を使用するには「shlwapi.h」をインクルードし、「shlwapi.lib」を追加してください。

超簡単なサンプル

コード:

#inclued <iostream>
#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib")

int main(void)
{
	TCHAR path[] = "hoge.dat";
	
	cout << "Before:" << path << "\n";
	
	//拡張子を取り除く
	PathRemoveExtension(path);
	
	cout << "After:" << path << "\n";
	
	return 0;
}

taketoshi
記事: 221
登録日時: 8年前
住所: 日本国

Re: win32apiの豆知識

#11

投稿記事 by taketoshi » 8年前

おお、それも便利だ!存在を知らない便利なAPIはまだまだ多いと思うので、良質なWINAPIのスレにしていきましょう。
では私も。

DWORD = GetModuleFileName(HMODULE hModule,LPSTR lpFilename,DWORD nBuffSize);
実行中のファイル名を含むパスを取得します。hModuleにNULLを指定する事で、自プロセスの取得が可能です。
返り値はバッファにコピーされた文字列長が格納されます

コード:

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

int main(void)
{
	char szFilePath[MAX_PATH];
	//szFilePathにパスを取得
	GetModuleFileName(NULL,szFilePath,sizeof(szFilePath));
	printf("%s\n",szFilePath);
	return 0;
}

アバター
Cir
記事: 32
登録日時: 8年前
住所: 近畿地方

Re: win32apiの豆知識

#12

投稿記事 by Cir » 8年前

便利な関数はまだまだたくさんあるので、皆さんに是非知っていただきたいですね!

BOOL PathRenameExtension(LPTSTR pszPath, LPCTSTR pszExt);
パスの拡張子を変更します。
pszPathには拡張子を変更したいパスを、pszExtは「.(半角ピリオド)」を含む拡張子を指定します。
拡張子の変更に失敗した場合関数は0を、成功した場合関数は0以外を返します。
この関数を使用するには、「shlwapi.h」をインクルードし、「shlwapi.lib」を追加してください。

超簡単なサンプル

コード:

#include <stdio.h>
#include <shlwapi.h>
 
#pragma comment(lib, "shlwapi.lib")
 
int main(int argc, char **argv)
{
    char path[] = "hoge.txt";
    
    printf("before:%s\n", path);
    
    //拡張子を「.orz」に変更
    PathRenameExtension(path, ".orz");
    
    printf("after:%s\n", path);
    
    return 0;
}

アバター
lbfuvab
記事: 72
登録日時: 8年前

Re: win32apiの豆知識

#13

投稿記事 by lbfuvab » 8年前

Write/GetPrivateProfile~~~系の関数で
ファイル名を"./hoge.hoge"の様に指定するとカレントディレクトリを検索してくれるみたいです(Win7確認済み)
何気に便利だと思いますw

アバター
lbfuvab
記事: 72
登録日時: 8年前

Re: win32apiの豆知識

#14

投稿記事 by lbfuvab » 8年前

補足ですが、
単に"hoge.hoge"の様にするとこれらの関数はWindowsのフォルダ内の検索をしてしまい、残念な感じになってしまいます。。。

taketoshi
記事: 221
登録日時: 8年前
住所: 日本国

Re: win32apiの豆知識

#15

投稿記事 by taketoshi » 8年前

身元調査プログラムが書けます。

BOOL GetUserName(LPSTR lpBuff,LPDWORD nSize);
プログラムを実行中のユーザー名を取得します。
同様事例としてGetComputerName関数があります。

コード:

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

int main()
{
	char szBuff[512];
	DWORD nSize = sizeof(szBuff) / sizeof(szBuff[0]);
	BOOL nRet;

	nRet = GetUserName(szBuff,&nSize);
	if(nRet == FALSE){
		strncpy(szBuff,"error",sizeof(szBuff));
	}
	printf("このパソコンのユーザー名は%sです\n",szBuff);
	printf("文字数は%dです\n",nSize);

	return 0;
}

nSizeにバッファのサイズを予め指定しておかないとエラーになります。
何故、バッファのサイズと、書き込んだ文字数を分離しなかったのかは謎。

アバター
shiro4ao
記事: 224
登録日時: 8年前
住所: 広島

Re: win32apiの豆知識

#16

投稿記事 by shiro4ao » 8年前

WindowsVista以降では(エディションによるが)美しいガラスウィンドウを扱うことができます。
通常はアプリケーションの枠だけにガラス効果が付いていますが、
せっかくなので、クライアント領域にガラス効果を付けてみます


DwmExtendFrameIntoClientAreaという関数を使ってみました。
ウィンドウフレームをクライアント領域まで拡張してくれるようです。

HRESULT WINAPI DwmExtendFrameIntoClientArea
(HWND hWnd,
__in const MARGINS *pMarInset
);

第1引数はウィンドウハンドル、第2引数はMARGINSという構造体へのポインタ。
(詳細:http://msdn.microsoft.com/en-us/library ... 85%29.aspx

対応情報
バージョン Windows Vista
ヘッダ Dwmapi.h
ライブラリ Dwmapi.lib
DLL Dwmapi.dll




そして、MARGINS構造体を調べたところ、
typedef struct _MARGINS {
int cxLeftWidth;
int cxRightWidth;
int cyTopHeight;
int cyBottomHeight;
} MARGINS, *PMARGINS;

ヴィジュアルスタイルを適用する領域を示すためのメンバが詰まっていました。
-1を入れると、全領域にわたってガラスにしてくれます。
http://msdn.microsoft.com/en-us/library ... 85%29.aspx


実際に呼び出す際には、Dwmapi.hとDwmapi.libが必要です。
使い方は簡単で、
MARGINS構造体で、どこまでガラスにするか決めて、
DwmExtendFrameIntoClientArea関数を呼ぶだけです。

コード:


		case WM_CREATE:
			{
	   			MARGINS m={-1};
				DwmExtendFrameIntoClientArea(hWnd,&m);
				break;
			}
ただし、ガラス効果の適用は、黒い部分に適用されるため、ボタンのテキストや、文字などもガラス効果になり
見づらくなることもあります。

アバター
Cir
記事: 32
登録日時: 8年前
住所: 近畿地方

Re: win32apiの豆知識

#17

投稿記事 by Cir » 8年前

WIN32APIに関係しているかどうか怪しいですが…

BOOL WINAPI cdtInit(int FAR *pdxCard, int FAR *pdyCard);
BOOL WINAPI cdtDraw(HDC hdc, int x, int y, int card, int type, COLORREF color);
void WINAPI cdtTerm(void);


ウィンドウズに標準でついてくるゲームの中に、トランプを使ったゲーム(ソリティア等)があります。
そのゲーム内で使用されている、カードを描画するための関数です。

BOOL WINAPI cdtInit(int FAR *pdxCard, int FAR *pdyCard);
トランプ画像を初期化します。
pdxCard, pdyCardには、カードの横幅・縦幅を格納するためのポインタを指定します。
関数が成功すれば0以外が、失敗すれば0が返されます。

BOOL WINAPI cdtDraw(HDC hdc, int x, int y, int card, int type, COLORREF color);
トランプを描画します。
hdcには描画するデバイスコンテキスト、x, yには描画先の座標、cardにはカードナンバー、typeにはカードタイプ、colorにはカードの背景色を指定します。
関数が成功すれば0以外が、失敗すれば0が返されます。

void WINAPI cdtTerm(void);
トランプ画像を開放します。
引数、戻り値はありません。

これらの関数は「cards.dll」内にあるので、LoadLibrary関数、GetProcAddress関数を使用して関数のアドレスを所得し、呼び出してください。

サンプル(ちょっと長い)

コード:

#include <windows.h>
#include <tchar.h>

//card.dll内の関数
typedef BOOL (WINAPI *pfcdtInit)(int FAR *pdxCard, int FAR *pdyCard);
typedef BOOL (WINAPI *pfcdtDraw)(HDC hdc, int x, int y, int card, int type, COLORREF color);
typedef void (WINAPI *pfcdtTerm)(void);

pfcdtInit cdtInit;
pfcdtDraw cdtDraw;
pfcdtTerm cdtTerm;

//cdtDrawで使うと便利なマクロ
//指定した番号、スートからカードを決める
#define CARD(n, k)			((n) * 4 + (k))

//スート(絵柄マーク)
#define SUIT_CLUBS			(0)					//クラブ
#define SUIT_DIAMONDS		(1)					//ダイアモンド
#define SUIT_HEARTS			(2)					//ハート
#define SUIT_SPADES			(3)					//スペード

//カードの模様
#define B_CROSSHATCH		(53)
#define B_PLAID				(54)
#define B_WEAVE				(55)
#define B_ROBOT				(56)
#define B_ROSES				(57)
#define B_IVYBLACK			(58)
#define B_IVYBLUE			(59)
#define B_FISHCYAN			(60)
#define B_FISHBLUE			(61)
#define B_SHELL				(62)
#define B_CASTLE			(63)
#define B_BEACH				(64)
#define B_CARDHAND			(65)
#define B_UNUSED			(66)
#define B_X					(67)
#define B_O					(68)

//カードの描画タイプ
#define D_FACES				(0)					//表(数字が描かれている面)
#define D_BACKS				(1)					//裏(模様が描かれている面)
#define D_INVERT			(2)					//カードを消す(消す色はcolorで指定)

//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
	HDC hdc;
	PAINTSTRUCT ps;
	static HMODULE hDll;

	static int CardWidth, CardHeight;

	switch(msg)
	{
	//ウィンドウ生成
	case WM_CREATE:

		//cards.dll読み込み
		hDll = LoadLibrary(_T("cards.dll"));
		if(hDll == NULL) return -1;

		cdtInit = (pfcdtInit)GetProcAddress(hDll, "cdtInit");
		cdtDraw = (pfcdtDraw)GetProcAddress(hDll, "cdtDraw");
		cdtTerm = (pfcdtTerm)GetProcAddress(hDll, "cdtTerm");

		//cards.dll初期化
		cdtInit(&CardWidth, &CardHeight);

		return 0;
	
	//描画処理
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
	
		//カードの描画
		for(int i = SUIT_CLUBS; i <= SUIT_SPADES; i ++)
		{
			for(int j = 0; j < 13; j ++)
			{
				cdtDraw(hdc, j * CardWidth, (i - SUIT_CLUBS) * CardHeight, CARD(j, i), D_FACES, RGB(255, 255, 255));
			}
		}
		//カードの模様の描画
		for(int i = B_CROSSHATCH; i <= B_O; i ++)
		{
			cdtDraw(hdc, (i - B_CROSSHATCH) * CardWidth / 2, 4 * CardHeight, i, D_BACKS, RGB(255, 255, 255));
		}

		EndPaint(hWnd, &ps);

		break;

	//ウィンドウを閉じる
	case WM_CLOSE:
		cdtTerm();
		DestroyWindow(hWnd);

		break;

	//終了
	case WM_DESTROY:

		FreeLibrary(hDll);

		DestroyWindow(hWnd);
		PostQuitMessage(0);
		break;
	
	//その他
	default:
		return DefWindowProc(hWnd, msg, wp, lp);
	}

	return 0;
}


//ウィンドウクラスの登録
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 = _T("cardsdll");
	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(_T("cardsdll"), _T("DLL"), 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;
}

//WinMain関数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nShowCmd)
{
	MSG msg;
	BOOL bRet;

	//初期化処理
	if(!InitApp(hInstance)) return FALSE;
	if(!InitInstance(hInstance, nShowCmd)) return FALSE;
	
	//メッセージループ
	while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
	{
		if(bRet == -1)
		{
			MessageBox(NULL, TEXT("GetMessage Error"), TEXT("ERROR"), MB_OK | MB_ICONHAND);
			break;
		}
		else
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return (int)msg.wParam;
}


ISLe
記事: 2645
登録日時: 8年前
連絡を取る:

Re: win32apiの豆知識

#18

投稿記事 by ISLe » 8年前

Cir さんが書きました:これらの関数は「cards.dll」内にあるので、LoadLibrary関数、GetProcAddress関数を使用して関数のアドレスを所得し、呼び出してください。
BOOL WINAPI cdtDrawExt(HDC hdc, int x, int y, int w, int h, int card, int type, COLORREF color);
という関数もありますよ。
描画サイズを指定できるcdtDrawです。

あとcdtAnimateという関数もあるのですけどこいつは使い方が分かってません。
いちおうプロトタイプは
BOOL WINAPI cdtAnimate(HDC hdc, int back, int x, int y, int state);
となってます。

残念ながらcards.dllはVista以降に付属していないのですよね。
ウィンドウズの一部なのでcards.dllだけを他のウィンドウズにコピーすることはライセンス違反になりますので注意しましょう。

ISLe
記事: 2645
登録日時: 8年前
連絡を取る:

Re: win32apiの豆知識

#19

投稿記事 by ISLe » 8年前

OutputDebugString APIを使うと、Visual Studioの出力ウインドウやDebugViewのようなユーティリティにテキスト出力できることは知られていますが、OutputDebugStringは引数に文字列をひとつ取るだけの仕様で使い勝手がよくありません。

MFCにはTRACEというマクロが用意されていてprintf感覚でデバッグ出力できるのですが、MFCは有償エディションにしか付いていません。

そんなわけでウチではこんな内容のヘッダファイルを作って利用しています。

コード:

#ifndef ISLE_TRACE_H
#define ISLE_TRACE_H
#ifdef _DEBUG
#include <windows.h>
#include <stdarg.h>
static void TRACE(LPCTSTR format, ...)
{
	TCHAR str[1024+1];
	va_list args;
	va_start(args, format);
	wvsprintf(str, format, args);
	OutputDebugString(str);
	va_end(args);
}
#else
#define TRACE(...)
#endif
#endif
#自分のブログに投稿していたものですが、せっかくなので紹介します。

(追記)
Windows APIしか使っていないので浮動小数点数(書式指定子%f)が使えません。
自分は滅多に浮動小数点数を使わないのですが、無いと困るという方はCRTライブラリ関数で書き換えてください。

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

Re: win32apiの豆知識

#20

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

DwmExtendFrameIntoClientArea関数、すごいですね。
grasstest.jpg
テストのスクリーンショットです。
grasstest.jpg (33.9 KiB) 閲覧数: 4848 回
※下のウィンドウが透けています
shiro4ao さんが書きました:実際に呼び出す際には、Dwmapi.hとDwmapi.libが必要です。
そのようなものはありませんでしたが、必要もありませんでした。

コード:

#include <windows.h>

LPCSTR szWindowClass = "SAMPLE_CLASS";
LPCSTR szWindowTitle = "Sample Application";
LPCSTR szHello = "Hello, Windows C Programming !";

typedef struct _MARGINS {
	int cxLeftWidth;
	int cxRightWidth;
	int cyTopHeight;
	int cyBottomHeight;
} MARGINS, *PMARGINS;

typedef HRESULT (WINAPI *pDwmExtendFrameIntoClientArea)
	(HWND hWnd,
	const MARGINS *pMarInset
);

pDwmExtendFrameIntoClientArea _DwmExtendFrameIntoClientArea;
HMODULE hdll;

LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
						 WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC hdc;
	RECT rt;

	switch (message) {
		case WM_CREATE:
			{
				MARGINS m={-1};
				_DwmExtendFrameIntoClientArea(hWnd,&m);
			}
			break;
		case WM_COMMAND:
			switch (LOWORD(wParam)) {
				default:
					return DefWindowProc(hWnd, message, wParam, lParam);
			}
			break;
		case WM_PAINT:
			hdc = BeginPaint(hWnd, &ps);
			GetClientRect(hWnd, &rt);
			FillRect(hdc,&rt,GetStockObject(BLACK_BRUSH));
			EndPaint(hWnd, &ps);
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
   	}

	return 0;
}

int APIENTRY WinMain(HINSTANCE hInstance,
					 HINSTANCE hPrevInstance,
					 LPSTR	 lpCmdLine,
					 int	   nCmdShow)
{
	MSG msg;
	WNDCLASSEX wcex;
	HWND hWnd;

	hdll=LoadLibrary("Dwmapi.dll");
	if(hdll==NULL) {
		MessageBox(hWnd,"dllが読み込めません。","エラー",MB_OK | MB_ICONWARNING | MB_TOPMOST);
		return 1;
	} else {
		_DwmExtendFrameIntoClientArea=(pDwmExtendFrameIntoClientArea)
			GetProcAddress(hdll,"DwmExtendFrameIntoClientArea");
		if(_DwmExtendFrameIntoClientArea==NULL) {
			FreeLibrary(hdll);
			MessageBox(hWnd,"関数が読み込めません。","エラー",MB_OK | MB_ICONWARNING | MB_TOPMOST);
			return 1;
		}
	}

	wcex.cbSize = sizeof(WNDCLASSEX); 

	wcex.style          = CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc    = (WNDPROC)WndProc;
	wcex.cbClsExtra     = 0;
	wcex.cbWndExtra	    = 0;
	wcex.hInstance      = hInstance;
	wcex.hIcon          = LoadIcon(NULL,IDI_APPLICATION);
	wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName   = NULL;
	wcex.lpszClassName  = szWindowClass;
	wcex.hIconSm        = NULL;

	RegisterClassEx(&wcex);

	hWnd = CreateWindow(szWindowClass,
		szWindowTitle, WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
		NULL, NULL, hInstance, NULL);

	if (!hWnd) 
		return FALSE;

	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);

	while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	FreeLibrary(hdll);

	return msg.wParam;
}
添付ファイル
grasstest.zip
テストのプログラムです。
(10.22 KiB) ダウンロード数: 158 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

“Win32 API” へ戻る