2007-03-27
/*
カレントフォルダのパスを求める(ユニコード版 と ANSI版)
:「 ♡桃色片想い♡ 」などのユニコード文字を含む名前のフォルダを作成してから
その中にこのプログラムを入れて実行することで効果を確認できます。
*/
#define _UNICODE
#define UNICODE
#include <windows.h>
#include<tchar.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow)
{
// ユニコード版
TCHAR CurrentFolderPath[MAX_PATH];
GetModuleFileName(hInstance, CurrentFolderPath, MAX_PATH);
WIN32_FIND_DATA FindFileData;
HANDLE hFind = FindFirstFile(CurrentFolderPath, &FindFileData);
if(hFind != INVALID_HANDLE_VALUE) {
FindClose(hFind);
CurrentFolderPath[lstrlen(CurrentFolderPath) - lstrlen(FindFileData.cFileName)] = '\0';
//lstrcat(CurrentFolderPath, _T("FPCopyY2.ini"));
MessageBox(NULL, CurrentFolderPath, _T("ユニコード版"), MB_OK);
} else {
MessageBox(NULL, CurrentFolderPath, _T("ユニコード版 - ファイルを見付けることが出来ませんでした。"), MB_ICONERROR);
}
// ANSI版
char CurrentFolderPathA[MAX_PATH];
GetModuleFileNameA(hInstance, CurrentFolderPathA, MAX_PATH);
WIN32_FIND_DATAA FindFileDataA;
HANDLE hFindA = FindFirstFileA(CurrentFolderPathA, &FindFileDataA);
/*
フォルダ名にユニコード文字が含まれる場合 ANSI版の方はユニコード文字の部分が ? に変わってしまい
フォルダを見付けることが出来なくて INVALID_HANDLE_VALUE が返る
*/
if(hFindA != INVALID_HANDLE_VALUE) {
FindClose(hFindA);
CurrentFolderPathA[lstrlenA(CurrentFolderPathA) - lstrlenA(FindFileDataA.cFileName)] = '\0';
//lstrcatA(CurrentFolderPathA, "FPCopyY2.ini");
MessageBoxA(NULL, CurrentFolderPathA, "ANSI版", MB_OK);
} else {
MessageBoxA(NULL, CurrentFolderPathA, "ANSI版 - ファイルを見付けることが出来ませんでした。", MB_ICONERROR);
}
return 0;
}
2007-03-25
/*
ユニコード文字が含まれるファイルパスをクリップボードに書き込む
:ドラッグ&ドロップした一つ目のファイルパスをクリップボードに書き込みます。
*/
#define _UNICODE
#define UNICODE
#include <windows.h>
#include<tchar.h>
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
LPWSTR* lpwCmdLineList;
int pNumArgs;
lpwCmdLineList = CommandLineToArgvW(GetCommandLineW(), &pNumArgs);
// クリップボードにテキストを書き込む
if(!OpenClipboard(NULL)) {
MessageBoxA(NULL,
"他のウィンドウが既にクリップボードを開いているなどの原因で Clipboard 関数は失敗ました。",
"error_message", MB_OK | MB_ICONERROR);
return 0;
}
if(!EmptyClipboard()) {
// クリップボードを空にし、クリップボード内のデータのハンドルを解放する。
// 同時に、クリップボードを開いたウィンドウに、クリップボードの所有権を与える。
MessageBoxA(NULL,
"他のウィンドウが既にクリップボードを開いているなどの原因で Clipboard 関数は失敗ました。",
"error_message", MB_OK | MB_ICONERROR);
return 0;
};
int length = lstrlenW(lpwCmdLineList[1]) * sizeof(TCHAR) + sizeof(TCHAR);
HGLOBAL hGlobal = GlobalAlloc(GHND | GMEM_DDESHARE, length);
TCHAR* clipInText = (TCHAR*)GlobalLock(hGlobal);
//lstrcpyW(clipInText, lpwCmdLineList[1]);
memcpy(clipInText, lpwCmdLineList[1], length);
GlobalUnlock(hGlobal);
if(!SetClipboardData(CF_UNICODETEXT, clipInText)) {
GlobalFree(hGlobal);
CloseClipboard();
return 0;
}
CloseClipboard();
return 0;
}
2007-03-20
/*
ファイルパスの¥(円マーク)を二重にしてクリップボードにコピーしたら、
今度はクリップボードにコピーしたテキストを読み取り、それを起動したメモ帳に貼り付ける。
*/
#pragma warning (disable : 4786)
#include <windows.h>
#include <string>
using namespace std;
void errorMessage() {
MessageBox(NULL,
"他のウィンドウが既にクリップボードを開いているなどの原因で Clipboard 関数は失敗ました。",
"error_message", MB_OK | MB_ICONERROR);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int)
{
char* pFilePathes[] = {
"C:\\WINDOWS\\NOTEPAD.EXE",
"C:\\WINDOWS\\system32\\cmd.exe",
"C:\\Program Files\\Windows Media Player\\Skins\\Revert.wmz",
"C:\\Documents and Settings\\All Users\\Application Data\\Microsoft\\Office\\Data\\data.dat",
};
int fileCount = 4;
string onePath, convert, resultPath;
int start = 0, position = 0, a = 0;
for(int i = 0; i < fileCount; i++)
{
onePath.assign(pFilePathes[i]);
position = (int)onePath.find_first_of("\\");
//
// C : \\ W I N D O W S \\ N O T E P A D . E X E
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
// ↑position
//
// ※ string::find_first_of() は見つからないときは npos(= -1) を返す
while(position != onePath.npos) {
convert.append(onePath.substr(start, position + 1 - start));
// string::substr(どこから,何文字)
convert.append("\\");
start = position + 1;
position = (int)onePath.find_first_of("\\", start);
}
convert.append(onePath.substr(start, position + 1 - start));
resultPath.append(convert);
if(fileCount != (i + 1)) resultPath.append("\r\n");
position = start = 0;
convert.clear();
}
// クリップボードにテキストを書き込む
if(!OpenClipboard(NULL)) {
errorMessage();
return 0;
}
if(!EmptyClipboard()) {
// クリップボードを空にし、クリップボード内のデータのハンドルを解放する。
// 同時に、クリップボードを開いたウィンドウに、クリップボードの所有権を与える。
errorMessage();
return 0;
};
HGLOBAL hGlobal = GlobalAlloc(GHND | GMEM_DDESHARE, lstrlen(resultPath.c_str()) + 1);
char* clipInText = (char*)GlobalLock(hGlobal);
lstrcpy(clipInText, resultPath.c_str());
GlobalUnlock(hGlobal);
if(!SetClipboardData(CF_TEXT, clipInText)) {
GlobalFree(hGlobal);
CloseClipboard();
return false;
}
CloseClipboard();
/*
// クリップボードのテキストを読み取る
if(!OpenClipboard(NULL)) {
errorMessage();
return 0;
}
HANDLE hClipout;
char* cliptext;
hClipout = GetClipboardData(CF_TEXT);
cliptext = (char *)GlobalLock(hClipout);
GlobalUnlock(hClipout);
*/
// メモ帳で表示
HWND hNotepad, hChild;
WinExec("notepad.exe", SW_SHOW);
hNotepad = FindWindow("Notepad", NULL);
hChild = GetWindow(hNotepad, GW_CHILD);
ShowWindow(hNotepad, SW_RESTORE);
SetWindowPos(hNotepad, HWND_TOP, 20, 20, 900, 400, SWP_SHOWWINDOW);
PostMessage(hChild, WM_PASTE, 0, 0);
/*
for(int i = 0; cliptext[i]; i++) {
PostMessage(hChild, WM_CHAR, (WPARAM)cliptext[i], 0);
}
*/
CloseClipboard();
return 0;
}
2005-03-20d
//////////////////////////////////////////////////////////////////////////////
//
// メモリマップドファイル
//
// :CreateFileMapping() の第一引数にファイルハンドルではなく、
// (HANDLE)0xffffffff を指定すると、
// ファイルではなく、システムのページファイルから物理メモリを取得する
//
#include <windows.h>
#define MAP_NAME "{14B50068-788B-4280-8C41-5AC43B2F9457}"
#define MAP_LENGTH 256
#define PAGING_MEMORY (HANDLE)0xffffffff
int APIENTRY WinMain( HINSTANCE, HINSTANCE, LPSTR, int)
{
char sBuff[1024];
char *fruits[] = { "apple", "orange", "grape", "banana" };
LPVOID mapView;
HANDLE hFileMap;
hFileMap = CreateFileMapping(PAGING_MEMORY,
NULL, PAGE_READWRITE, 0, MAP_LENGTH, MAP_NAME);
if(hFileMap == NULL) {
MessageBox(NULL, "CreateFileMapping", "false", MB_OK);
return FALSE;
}
mapView = MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if(mapView == NULL) {
MessageBox(NULL, "MapViewOfFile", "false", MB_OK);
CloseHandle(hFileMap);
return FALSE;
}
int select = 4, id = 0;
do {
if(!lstrcmp(fruits[0], (char *)mapView)) select = 0;
if(!lstrcmp(fruits[1], (char *)mapView)) select = 1;
if(!lstrcmp(fruits[2], (char *)mapView)) select = 2;
if(!lstrcmp(fruits[3], (char *)mapView)) select = 3;
switch(select) {
case 0:
lstrcpy((char *)mapView, fruits[1]);
break;
case 1:
lstrcpy((char *)mapView, fruits[2]);
break;
case 2:
lstrcpy((char *)mapView, fruits[3]);
break;
case 3:
lstrcpy((char *)mapView, fruits[0]);
break;
default:
lstrcpy((char *)mapView, fruits[0]);
break;
}
wsprintf(sBuff, "\"apple\", \"orange\", \"grape\", \"banana\"\n\n"
"select : %s\n\n%s",
(char *)mapView, "続けますか?");
id = MessageBox(NULL, sBuff, (char *)mapView, MB_YESNO);
} while(id != IDNO);
UnmapViewOfFile( (LPVOID)mapView );
CloseHandle( hFileMap);
return 0;
}
2005-03-20c
//////////////////////////////////////////////////////////////////////////////
//
// lstrlen と _mbslen
// : lstrlen は半角の数を数え、_mbslen は文字数を数える
//
#include <windows.h>
#include <mbstring.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int nCmdShow)
{
TCHAR *target = "aiueoあいうえお";
TCHAR sBuff[1024];
wsprintf(sBuff, "target : %s\nlstrlen : %d\n _mbslen : %d", target,
lstrlen(target), _mbslen((unsigned char *)target));
MessageBox(NULL, sBuff, "check", MB_OK);
return 0;
}
2005-03-20b
//////////////////////////////////////////////////////////////////////////////
//
// ダイアログにクラスを設定するときは、リソースファイルに#define _APS_NO_MFC 1
// を追加してから、プロパティで Class Name を設定する
// (#define _APS_NO_MFC 1 を追加してからでないと設定できない)
//
// :プロシージャでは、TRUE, FALSE ではなく、
// 0, DefWindowProc(hDlg, message, wParam, lParam) を返すようにする
//
#include <windows.h>
// #include "resource.h"
//------------------------------------------------//
// resource.h
#define IDD_DIALOG1 101
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC 1
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
//------------------------------------------------//
LRESULT CALLBACK WndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message) {
case WM_CLOSE:
DestroyWindow(hDlg);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hDlg, message, wParam, lParam);
}// switch(message)
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int nCmdShow)
{
WNDCLASSEX wcex;
ZeroMemory(&wcex, sizeof(WNDCLASSEX));
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = (UINT)NULL;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = DLGWINDOWEXTRA;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(NULL, IDI_INFORMATION);
wcex.hIconSm = LoadIcon(NULL, IDI_INFORMATION);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);//NULL;//(HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "abcd";// ダイアログのプロパティで設定したクラス名
RegisterClassEx(&wcex);
BYTE data[] = {
0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 0xc8, 0x90,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0x00,
0x5a, 0x00, 0x00, 0x00, 0x61, 0x00, 0x62, 0x00,
0x63, 0x00, 0x64, 0x00, 0x00, 0x00, 0x44, 0x00,
0x69, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6f, 0x00,
0x67, 0x00, 0x00, 0x00, 0x08, 0x00, 0x90, 0x01,
0x00, 0x01, 0x4d, 0x00, 0x53, 0x00, 0x20, 0x00,
0x53, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6c, 0x00,
0x6c, 0x00, 0x20, 0x00, 0x44, 0x00, 0x6c, 0x00,
0x67, 0x00, 0x00, 0x00,
};
HWND hWnd = CreateDialogIndirectParam(hInstance, (LPCDLGTEMPLATEA)data,
NULL, (DLGPROC)WndProc, 0);
ShowWindow(hWnd, SW_SHOW);
/*
//-- 通常、リソースファイルから読み込む場合 --//
HWND hDlg= CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1),
NULL, (DLGPROC)WndProc);
ShowWindow(hDlg, SW_SHOW);
*/
/*
//-- LoadResource で読み込む場合 --//
HGLOBAL hGlobal = LoadResource(hInstance,
FindResource(hInstance, MAKEINTRESOURCE(IDD_DIALOG1),
RT_DIALOG)
);
BYTE *lpDlgTmp = (BYTE *)LockResource(hGlobal);
HWND hWnd = CreateDialogIndirectParam(hInstance,
(LPCDLGTEMPLATEA)lpDlgTmp, NULL,
(DLGPROC)WndProc, 0);
UnlockResource(hGlobal);
GlobalFree(hGlobal);
ShowWindow(hWnd, SW_SHOW);
*/
/*
//-- LPDLGTEMPLATEEX でリソースの値を変える場合 --//
HGLOBAL hGlobal = LoadResource(hInstance,
FindResource(hInstance, MAKEINTRESOURCE(IDD_DIALOG1),
RT_DIALOG)
);
typedef struct {
WORD dlgVer;
WORD signature;
DWORD helpID;
DWORD exStyle;
DWORD style;
WORD cDlgItems;
short x;
short y;
short cx;
short cy;
// etc..
} DLGTEMPLATEEX, *LPDLGTEMPLATEEX;
LPDLGTEMPLATEEX lpDlgTmp = (LPDLGTEMPLATEEX)LockResource(hGlobal);
lpDlgTmp->x = 200;
lpDlgTmp->y = 100;
HWND hWnd = CreateDialogIndirectParam(hInstance,
(LPCDLGTEMPLATEA)lpDlgTmp, NULL,
(DLGPROC)WndProc, 0);
UnlockResource(hGlobal);
GlobalFree(hGlobal);
ShowWindow(hWnd, SW_SHOW);
*/
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
2005-03-20
/*
関数ポインタの定義
*/
#include <windows.h>
typedef int(*PFUNC)(int, int);
int myPlus(int a, int b) {
return a + b;
}
int myMinus(int a, int b) {
return a - b;
}
int myMultiplies(int a, int b) {
return a * b;
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, PSTR, int)
{
TCHAR sBuff[256], temp[256];
TCHAR *calc[] = { "10 + 7 = ", "10 - 7 = ", "10 x 7 = " };
PFUNC pFunc[] = { myPlus, myMinus, myMultiplies };
// int (*pFunc[])(int, int) = { myPlus, myMinus, myMultiplies };
sBuff[0] = '\0';
for(int i = 0; i < 3; i++) {
wsprintf(temp, "%s%2d\n", calc[i], pFunc[i](10, 7));
lstrcat(sBuff, temp);
}
MessageBox(NULL, sBuff, "check", MB_OK);
return 0;
}
/*
出力結果:
10 + 7 = 17
10 - 7 = 3
10 x 7 = 70
*/
2005-02-26
/*
「シングルトン(Singleton)パターン」による共通データや処理の管理
*/
#include <windows.h>
//--------------------------------------------------------------------------//
//////////////////////////////////////////////////////////////////////////////
//
// 共用データや共通の処理を提供するためのクラス
//
// : コンストラクタをプライベートにしてフレンド関数以外からはインスタンスを
// 作成できないようにしておく
//
class CCommonData
{
private:
CCommonData();// コンストラクタ
public:
~CCommonData() {}// デストラクタ
//-- 定数 --//
static const int WM_DATA1;
static const int WM_DATA2;
//-- メソッド --//
void SetMyWindowText(HWND hWnd, TCHAR *str);
friend CCommonData *GetCommonInstance();
};
// コンストラクタの定義
CCommonData::CCommonData() {
//
}
void CCommonData::SetMyWindowText(HWND hWnd, TCHAR *str) {
SetWindowText(hWnd, str);
}
//////////////////////////////////////////////////////////////////////////////
//
// 定数の初期化
//
const int CCommonData::WM_DATA1 = WM_APP + 1;
const int CCommonData::WM_DATA2 = WM_APP + 2;
//////////////////////////////////////////////////////////////////////////////
//
// 共用データのポインタを得るための関数
//
// : インスタンスを1つしか作らない仕組みにしておき、作成したインスタンスの
// ポインタを返す
//
CCommonData *GetCommonInstance() {
static CCommonData *only_one = NULL;
if(only_one == NULL) {
static CCommonData cCommon;
only_one = &cCommon;
}
return only_one;
}
//--------------------------------------------------------------------------//
LRESULT CALLBACK DlgWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
static CCommonData *cm = GetCommonInstance();
switch(message) {
case cm->WM_DATA1:
cm->SetMyWindowText(hDlg, "最小化されました");
break;
case cm->WM_DATA2:
cm->SetMyWindowText(hDlg, "通常の状態に戻りました");
case WM_SYSCOMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch(wmId) {
case SC_MINIMIZE:
SendMessage(hDlg, cm->WM_DATA1, 0, 0);
break;
case SC_RESTORE:
SendMessage(hDlg, cm->WM_DATA2, 0, 0);
break;
default:
return FALSE;
}// switch(wmId)
return FALSE;
// デフォルトのウインドウプロシージャにも渡すため FALSE を返す
case WM_CLOSE:
DestroyWindow(hDlg);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return FALSE;
}// switch(message)
return TRUE;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int nCmdShow)
{
BYTE data[] = { 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 0xca, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0x00,
0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00,
0x69, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6f, 0x00,
0x67, 0x00, 0x00, 0x00, 0x08, 0x00, 0x90, 0x01,
0x00, 0x01, 0x4d, 0x00, 0x53, 0x00, 0x20, 0x00,
0x53, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6c, 0x00,
0x6c, 0x00, 0x20, 0x00, 0x44, 0x00, 0x6c, 0x00,
0x67, 0x00, 0x00, 0x00 };
HWND hWnd = CreateDialogIndirectParam(hInstance,
(LPCDLGTEMPLATEA)data, NULL, (DLGPROC)DlgWndProc, 0);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
/*
※また、下記のようにWM_DATA1, WM_DATA2 を enum で定義してもいいかもしれない
//--------------------------------------------------------------------------//
//////////////////////////////////////////////////////////////////////////////
//
// 共用データや共通の処理を提供するためのクラス
//
// : コンストラクタをプライベートにしてフレンド関数以外からはインスタンスを
// 作成できないようにしておく
//
class CCommonData
{
private:
CCommonData();// コンストラクタ
public:
~CCommonData() {}// デストラクタ
enum {
WM_DATA1 = WM_APP + 1,
WM_DATA2,
};
//-- メソッド --//
void SetMyWindowText(HWND hWnd, TCHAR *str);
friend CCommonData *GetCommonInstance();
};
// コンストラクタの定義
CCommonData::CCommonData() {
//
}
void CCommonData::SetMyWindowText(HWND hWnd, TCHAR *str) {
SetWindowText(hWnd, str);
}
//////////////////////////////////////////////////////////////////////////////
//
// 共用データのポインタを得るための関数
//
// : インスタンスを1つしか作らない仕組みにしておき、作成したインスタンスの
// ポインタを返す
//
CCommonData *GetCommonInstance() {
static CCommonData *only_one = NULL;
if(only_one == NULL) {
static CCommonData cCommon;
only_one = &cCommon;
}
return only_one;
}
//--------------------------------------------------------------------------//
*/
2005-02-14
//////////////////////////////////////////////////////////////////////////////
//
// XML文書作成の基本(属性を書き込む2種類の方法)
//
#import <msxml4.dll>
#include <string>
#include <algorithm>
#include <fstream>
#include <iomanip>
#include <shlwapi.h> // PathRemoveFileSpec()
#pragma comment(lib, "shlwapi.lib") // PathRemoveFileSpec()
using namespace std;
int WINAPI WinMain(HINSTANCE, HINSTANCE, PSTR, int)
{
//-- COM初期化 --//
::CoInitialize(NULL);
try {
//-- インスタンスの作成 --//
MSXML2::IXMLDOMDocumentPtr pDoc = NULL;
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
//-- ルートノードの作成 --//
pDoc->loadXML(L"<?xml version=\"1.0\" encoding=\"EUC-JP\" ?>\n<test />");
MSXML2::IXMLDOMElementPtr root = pDoc->documentElement;
root->appendChild(pDoc->createTextNode("\n\t"));// 改行とタブ文字を追加
//-- ルートノードに新しい要素(子ノード)を追加 --//
MSXML2::IXMLDOMElementPtr nameElement = pDoc->createElement("person");
root->appendChild(nameElement);
//-- 属性を追加 --//
MSXML2::IXMLDOMNamedNodeMapPtr pXMLNamedNodeMap;
nameElement->get_attributes(&pXMLNamedNodeMap);
MSXML2::IXMLDOMAttributePtr att;
att = pDoc->createAttribute("sex");
att->value = "male";
pXMLNamedNodeMap->setNamedItem(att);
att = pDoc->createAttribute("age");
att->value = "35";
pXMLNamedNodeMap->setNamedItem(att);
/*
nameElement->setAttribute("sex", "male");
nameElement->setAttribute("age", "35");
*/
//-- リーフテキストを書き込む(追加) --//
nameElement->appendChild(pDoc->createTextNode("佐藤紀幸"));
root->appendChild(pDoc->createTextNode("\n"));// 改行を追加
//-- 保存用パスを作成 --//
TCHAR Path[_MAX_FNAME];
GetModuleFileName(NULL, Path, sizeof(Path));
PathRemoveFileSpec(Path);
lstrcat(Path, "\\sample.xml");
//-- XML文書を保存 -//
pDoc->save(Path);
//-- XML文書を読み込む --//
ifstream ifs(Path, ios::in | ios::binary);
string s;
//-- CR(復帰文字)を削除 --//
char ch;
for(int i = 0; ifs.get(ch); i++) {
if(ch != '\r') {
s += ch;
}
}
ifs.close();
//-- CR(復帰文字)を削除したXML文書を保存 -//
ofstream ofs(Path, ios::out | ios::binary);
ofs << s;
ofs.close();
MessageBox(NULL, pDoc->xml, "作成したXML文書の内容",MB_OK);
} catch (_com_error& e) {
TCHAR sBuff[1024];
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
wsprintf(sBuff, "Code: %08lx\n" "Code meaning: %s\n"
"Source: %s\n" "Description: %s",
e.Error(), e.ErrorMessage(),
(LPCSTR)bstrSource, (LPCSTR)bstrDescription);
MessageBox(NULL, sBuff, "error",MB_OK);
}
//-- COM終了処理 --//
::CoUninitialize();
return 0;
}
/*
出力結果:(起動パス)sample.xml
<?xml version="1.0" encoding="EUC-JP"?>
<test>
<person sex="male" age="35">佐藤紀幸</person>
</test>
*/
/*
※文字エンコードなどを指定する場合、
「C#.NET」や「VB.NET」では「XmlDeclaration.CreateXmlDeclaration()」という
メソッドがあるが、「C++」で利用するインターフェイスには存在しないので、
前もって「MSXML2::IXMLDOMDocument::loadXML()」で書き込んで、ルートノードを
作成しておくか
または、MSXML2::IXMLDOMDocument::createProcessingInstruction()を使用する
pDoc->appendChild(pDoc->createProcessingInstruction("xml",
"version=\"1.0\" encoding=\"UTF-8\""));
※参考ページ
・MSXML Tips :: August 2002 By: Darshan Singh (Managing Editor, PerfectXML.com)
*/
//////////////////////////////////////////////////////////////////////////////
//
// PathCompactPath() は指定したピクセル幅に、パスを成型してくれる
//
#include <windows.h>
#include <shlwapi.h>// PathCompactPath()
#pragma comment(lib ,"shlwapi.lib" )// PathCompactPath()
int WINAPI WinMain(HINSTANCE, HINSTANCE, PSTR, int)
{
static TCHAR Path[] = "C:\\Documents and Settings\\All Users\\"
"Application Data\\Adobe\\Photoshop Album\\"
"Catalog Folders\\My Catalog\\tn.4.cache";
int limit_pixel_size = 300;
MessageBox(NULL, Path, "フルパス", MB_OK);
HDC hdc = GetWindowDC(NULL);
PathCompactPath(hdc, Path, limit_pixel_size);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
MessageBox(NULL, Path, "ショートパス", MB_OK);
ReleaseDC(NULL, hdc);
return 0;
}
※参考ページ
・選択したディレクトリのフルパスを表示する
○ エディットボックスを Read-Only に設定すると、グレー表示になるが、背景色を
元の白に戻したい場合は、下記のようなコードを書く
・・・・
case WM_CTLCOLORSTATIC:
if((HWND)lp == dwp.hEdit)
{ // Read-Only エディットボックスは、WM_CTLCOLORSTATIC で処理する
SetBkColor((HDC)wp, RGB(255, 255, 255)); // 文字列の背景色を設定
return (LRESULT)GetStockObject(WHITE_BRUSH);
// ブラシを返して、コントロールの背景色を設定
}
break;
・・・・
※ここで注目するのは、WM_CTLCOLOREDIT ではなく、WM_CTLCOLORSTATIC で処理
するところ! グレー表示はスタティックカラーコントロールで処理されている
※参考ページ
・(CodeGuru)READONLY and DISABLED controls are processed using CTLCOLOR_STATIC!
//////////////////////////////////////////////////////////////////////////////
//
// クリックするたびにアイコンを変える
//
#include <windows.h>
#define IDD_DIALOG1 101
LRESULT CALLBACK DlgWndProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
static HICON hIcon[5];
static const TCHAR *icon[5] = { IDI_APPLICATION, IDI_INFORMATION,
IDI_ERROR, IDI_WARNING, IDI_QUESTION };
static ico_number = 0;
switch(msg) {
case WM_INITDIALOG:
{
SetWindowText(hDlg, "クリックでアイコンが変わります");
for(int i = 0; i < 5; i++) {
hIcon[i] = (HICON)LoadIcon(NULL, icon[i]);
}
SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon[ico_number]);
// タイトルバーとタスクバーのアイコンを変更
SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon[ico_number]);
// [ALT] + [TAB] を押した時に出るアイコンを変更
ico_number++;
break;
}
case WM_LBUTTONDOWN:
if(ico_number > 4) ico_number = 0;
SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hIcon[ico_number]);
SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hIcon[ico_number]);
ico_number++;
break;
case WM_CLOSE:
DestroyWindow(hDlg);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return FALSE;
}// switch(msg)
return TRUE;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int nCmdShow)
{
BYTE data[] = { 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 0xca, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0x00,
0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00,
0x69, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6f, 0x00,
0x67, 0x00, 0x00, 0x00, 0x08, 0x00, 0x90, 0x01,
0x00, 0x01, 0x4d, 0x00, 0x53, 0x00, 0x20, 0x00,
0x53, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6c, 0x00,
0x6c, 0x00, 0x20, 0x00, 0x44, 0x00, 0x6c, 0x00,
0x67, 0x00, 0x00, 0x00 };
HWND hWnd = CreateDialogIndirectParam(hInstance,
(LPCDLGTEMPLATEA)data, NULL, (DLGPROC)DlgWndProc, 0);
//HICON hIcon = (HICON)LoadIcon(NULL, IDI_QUESTION);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
○外部からアイコンを設定する場合は下記のようにする
HICON hIcon =
(HICON)LoadImage(NULL, ".\\test.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE);
○非表示の親ウインドウなどを、下記のようなコードで最小化するとメモリが解放される
SendMessage(GetDesktopWindow(), WM_SETREDRAW, FALSE, 0);
ShowWindow(hWnd, SW_MINIMIZE);
ShowWindow(hWnd, SW_HIDE);
SendMessage(GetDesktopWindow(), WM_SETREDRAW, TRUE, 0);
//////////////////////////////////////////////////////////////////////////////
//
// 常に最背面に表示され、ワークエリアから出られないウインドウ
// : 四隅 100 ピクセル内で端にひっつく
// : WM_WINDOWPOSCHANGING
//
#include <windows.h>
#define IDD_DIALOG1 101
LRESULT CALLBACK DlgWndProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
static RECT wa;
LPWINDOWPOS lw;
switch(msg) {
case WM_WINDOWPOSCHANGING:
lw = (LPWINDOWPOS)lp;
lw->hwndInsertAfter = HWND_BOTTOM;
if(lw->x < wa.left + 100) lw->x = wa.left;
if(lw->y < wa.top + 100) lw->y = wa.top;
if((lw->x + lw->cx + 100) > wa.right ) lw->x = wa.right - lw->cx;
if((lw->y + lw->cy + 100) > wa.bottom) lw->y = wa.bottom - lw->cy;
break;
case WM_INITDIALOG:
//
// タスクバーを除いたワークエリアの座標を求める
//
ZeroMemory(&wa, sizeof(wa));
SystemParametersInfo(SPI_GETWORKAREA, 0, &wa, 0);
break;
case WM_CLOSE:
DestroyWindow(hDlg);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return FALSE;
}// switch(msg)
return TRUE;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int nCmdShow)
{
BYTE data[] = { 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 0xca, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0x00,
0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00,
0x69, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6f, 0x00,
0x67, 0x00, 0x00, 0x00, 0x08, 0x00, 0x90, 0x01,
0x00, 0x01, 0x4d, 0x00, 0x53, 0x00, 0x20, 0x00,
0x53, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6c, 0x00,
0x6c, 0x00, 0x20, 0x00, 0x44, 0x00, 0x6c, 0x00,
0x67, 0x00, 0x00, 0x00 };
HWND hWnd = CreateDialogIndirectParam(hInstance,
(LPCDLGTEMPLATEA)data, NULL, (DLGPROC)DlgWndProc, 0);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
//////////////////////////////////////////////////////////////////////////////
//
// タスクトレイにアイコンを追加する基本
//
// : 最小化ボタンでタスクトレイに格納(同時にバルーン情報を表示)
// : タスクトレイのアイコンをクリックして復帰
// : タスクトレイのアイコンを右クリックしてアイコンを変更
//
#define _WIN32_WINNT 0x0501
#define WINVER 0x0501
#define _WIN32_IE 0x0600
#include <windows.h>
#define IDD_DIALOG1 101
LRESULT CALLBACK DlgWndProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
int wmId, wmEvent;
static const int ID_MYTRAY = WM_APP + 1;
static const int MYTRAY_MESSAGE = WM_APP + 2;
static NOTIFYICONDATA ni;
static bool bIcon = true;
switch(msg) {
case MYTRAY_MESSAGE:
if(wp == ID_MYTRAY)
switch(lp)
{
case WM_LBUTTONDOWN:
ShowWindow(hDlg, SW_SHOW);
Shell_NotifyIcon(NIM_DELETE, &ni);
// タスクトレイからアイコンを削除
break;
case WM_RBUTTONDOWN:
if(bIcon) {
ni.hIcon = (HICON)LoadIcon(NULL, IDI_WARNING);
bIcon = false;
} else {
ni.hIcon = (HICON)LoadIcon(NULL, IDI_QUESTION);
bIcon = true;
}
Shell_NotifyIcon(NIM_MODIFY, &ni);
// タスクトレイのアイコンを変更
Shell_NotifyIcon(NIM_MODIFY, &ni);
// タスクトレイ情報の更新
break;
}
break;
case WM_INITDIALOG:
SetWindowText(hDlg, "最小化ボタンでタスクトレイに格納");
memset(&ni, 0, sizeof(NOTIFYICONDATA));
ni.cbSize = sizeof(NOTIFYICONDATA);
ni.hWnd = hDlg;
ni.uID = ID_MYTRAY;
ni.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
ni.hIcon = (HICON)LoadIcon(NULL, IDI_QUESTION);
ni.uCallbackMessage = MYTRAY_MESSAGE;
lstrcpy(ni.szTip, "クリックでタスクトレイから出す");
// バルーン表示
lstrcpy(ni.szInfoTitle,"情報!");
lstrcpy(ni.szInfo,"只今、最小化されました!");
ni.dwInfoFlags = NIIF_INFO;
break;
case WM_SYSCOMMAND:
wmId = LOWORD(wp);
wmEvent = HIWORD(wp);
switch(wmId) {
case SC_MINIMIZE:
ShowWindow(hDlg, SW_HIDE);
/* バルーン表示機能のセット */
ni.uFlags = (ni.uFlags | NIF_INFO);
Shell_NotifyIcon(NIM_ADD, &ni);// タスクトレイにアイコンを追加
// 同時にバルーン情報を表示
/* バルーン表示機能の解除 */
ni.uFlags = (ni.uFlags & ~NIF_INFO);
Shell_NotifyIcon(NIM_MODIFY, &ni);// タスクトレイ情報の更新
break;
default:
return FALSE;
}// switch(wmId)
break;
// デフォルトのウインドウプロシージャには渡さないため
// break して TRUE を返す
case WM_CLOSE:
DestroyWindow(hDlg);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return FALSE;
}// switch(msg)
return TRUE;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int nCmdShow)
{
BYTE data[] = { 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 0xca, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0x00,
0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00,
0x69, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6f, 0x00,
0x67, 0x00, 0x00, 0x00, 0x08, 0x00, 0x90, 0x01,
0x00, 0x01, 0x4d, 0x00, 0x53, 0x00, 0x20, 0x00,
0x53, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6c, 0x00,
0x6c, 0x00, 0x20, 0x00, 0x44, 0x00, 0x6c, 0x00,
0x67, 0x00, 0x00, 0x00 };
HWND hWnd = CreateDialogIndirectParam(hInstance,
(LPCDLGTEMPLATEA)data, NULL, (DLGPROC)DlgWndProc, 0);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
//////////////////////////////////////////////////////////////////////////////
//
// 経過秒数を求める
//
#include <windows.h>
#include <time.h>
#define IDD_DIALOG1 101
LRESULT CALLBACK DlgWndProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
static clock_t start_time;
switch(msg) {
case WM_INITDIALOG:
SetTimer(hDlg, 100, 500, NULL);
start_time = clock();
break;
case WM_TIMER:
InvalidateRect(hDlg, NULL, true);
break;
case WM_PAINT:
{
clock_t current_time = clock();
int second = (current_time - start_time) / CLOCKS_PER_SEC;
TCHAR sBuff[256];
wsprintf(sBuff, "%03d 秒経過", second);
PAINTSTRUCT ps;
HDC hDC = BeginPaint(hDlg, &ps);
TextOut(hDC, 10, 10, (LPCTSTR)sBuff, lstrlen(sBuff));
EndPaint(hDlg, &ps);
break;
}
case WM_CLOSE:
KillTimer(hDlg, 100);
DestroyWindow(hDlg);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return FALSE;
}// switch(msg)
return TRUE;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int nCmdShow)
{
BYTE data[] = { 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 0xca, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xba, 0x00,
0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00,
0x69, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6f, 0x00,
0x67, 0x00, 0x00, 0x00, 0x08, 0x00, 0x90, 0x01,
0x00, 0x01, 0x4d, 0x00, 0x53, 0x00, 0x20, 0x00,
0x53, 0x00, 0x68, 0x00, 0x65, 0x00, 0x6c, 0x00,
0x6c, 0x00, 0x20, 0x00, 0x44, 0x00, 0x6c, 0x00,
0x67, 0x00, 0x00, 0x00 };
HWND hWnd = CreateDialogIndirectParam(hInstance,
(LPCDLGTEMPLATEA)data, NULL, (DLGPROC)DlgWndProc, 0);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}