RECT rt;
HWND hctrl;
HDC hdc;
hctrl = GetDlgItem(hdlg1,IDC_GRAPH);
GetWindowRect(hctrl,&rt);
hdc = GetDC(hctrl);
StretchBlt(hdc,0,0,rt.right-rt.left,rt.bottom-rt.top,
hbuffer,0,0,bufx,bufy,SRCCOPY);
ReleaseDC(hctrl,hdc);
save_pen = (HPEN) SelectObject(hbuffer,hpen);
save_brush = (HBRUSH) SelectObject(hbuffer,hbrush);
Rectangle(hbuffer,left,bottom,right,top);
SelectObject(hbuffer,save_brush);
SelectObject(hbuffer,save_pen);
// HSV色空間→RGBへ変換(HSVは0〜1に正規化)
COLORREF hsv2rgb(double h, double s, double v)
{
double i,f,p,q,t;
if ( s == 0 ){ // グレイスケール
return(RGB(v*255,v*255,v*255));
}
else { // S=0以外
if (1.0 <= h)
h -= 1.0;
h *= 6.0;
i = floor (h);
f = h - i;
p = v * (1 - s);
q = v * (1 - (s * f));
t = v * (1 - (s * (1 - f)));
if( i < 1 )
return(RGB(v*255,t*255,p*255));
else if( i < 2 )
return(RGB(q*255,v*255,p*255));
else if( i < 3 )
return(RGB(p*255,v*255,t*255));
else if( i < 4 )
return(RGB(p*255,q*255,v*255));
else if( i < 5 )
return(RGB(t*255,p*255,v*255));
else
return(RGB(v*255,p*255,q*255));
}
}
static BOOL init_piccon_subproc(HWND hwnd)
{
// ピクチャコントロールルーチンのアドレスを取得して保存しておく。
ppiccon = GetWindowLong(GetDlgItem(hwnd,IDC_GRAPH),GWL_WNDPROC);
// ピクチャコントロールルーチンのアドレスをサブクラス化ルーチンのアドレスに変更
SetWindowLong(GetDlgItem(hwnd,IDC_GRAPH),GWL_WNDPROC,(LONG)piccon_subproc);
return TRUE;
}
LRESULT CALLBACK piccon_subproc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
PAINTSTRUCT ps;
HDC hdc;
RECT rt;
switch (msg) {
// 再描画処理を追加してみた
case WM_PAINT:
GetWindowRect(hWnd,&rt);
hdc = BeginPaint(hWnd, &ps);
StretchBlt(hdc,0,0,rt.right-rt.left,rt.bottom-rt.top,
cg.hbuffer,0,0,cg.bufx,cg.bufy,SRCCOPY);
EndPaint(hWnd, &ps);
break;
}
// 続けて、本来のピクチャコントロールの処理をおこなう
return CallWindowProc((WNDPROC)ppiccon,hWnd,msg,wp,lp);
}
//URLリンク文字列にアンダーバーを付ける
g.hLinkfont = setFontSetting(hdlg, IDC_LINKURL, 10, 1);
LRESULT CALLBACK linkProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg){
case WM_SETCURSOR: //マウスポインタの変更
SetCursor(g.hCur);
return 0;
case WM_PAINT: // リンク文字列を青く書き直す
PAINTSTRUCT ps;
HDC hdc;
char line[256];
GetWindowText(hWnd, line, 255);
hdc = BeginPaint(hWnd, &ps);
SelectObject(hdc, g.hLinkfont);
SetTextColor(hdc, RGB(0, 0, 255)); // 文字を青くする
SetBkColor(hdc, GetSysColor(COLOR_BTNFACE));
SetBkMode(hdc, OPAQUE);
TextOut(hdc, 0, 0, line, lstrlen(line));
EndPaint(hWnd, &ps);
return 0;
}
return CallWindowProc(oldlinkProc, hWnd, msg, wp, lp);
}
//URLリンク文字列のサブクラス化
oldlinkProc = (WNDPROC)GetWindowLong(GetDlgItem(hdlg, IDC_LINKURL), GWL_WNDPROC);
SetWindowLong(GetDlgItem(hdlg, IDC_LINKURL), GWL_WNDPROC, (LONG)linkProc);
case WM_COMMAND:
switch (LOWORD(wp)) {
case IDC_LINKURL:
if (HIWORD(wp) == STN_CLICKED) {
char line[256];
GetDlgItemText(hdlg, LOWORD(wp), line, 255);
ShellExecute(hdlg, "open", line, NULL, NULL, SW_SHOWDEFAULT);
}
break;
}
break;
LRESULT CALLBACK linkProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
HDC hdc;
PAINTSTRUCT ps;
COLORREF cr;
LOGFONT lf;
HFONT hFont;
HCURSOR hCursor;
switch (msg) {
case WM_SETCURSOR: // マウスポインタの変更
hCursor = LoadCursor(g.hInst, MAKEINTRESOURCE(IDI_CURSOR1));
SetCursor(hCursor);
return 0;
case WM_LBUTTONDOWN: // ブラウザでURLを開く
ShellExecute(hWnd, "open", g.linkurl, NULL, NULL, SW_SHOWDEFAULT);
return 0;
case WM_PAINT: // リンク文字列にアンダーバーを付けて青く書き直す
hdc = BeginPaint(hWnd, &ps);
memset(&lf, 0, sizeof(LOGFONT));
strcpy_s(lf.lfFaceName, "system");
lf.lfUnderline = TRUE;
hFont = CreateFontIndirect(&lf);
SelectObject(hdc, (HGDIOBJ)hFont);
cr = GetSysColor(COLOR_MENU);
SetBkColor(hdc, cr);
SetTextColor(hdc, RGB(0, 0, 255));
SetBkMode(hdc, TRANSPARENT);
TextOut(hdc, 0, 0, g.linkurl, strlen(g.linkurl));
DeleteObject(hFont);
EndPaint(hWnd, &ps);
return 0;
}
return (CallWindowProc(oldlinkProc, hWnd, msg, wp, lp));
}
void SaveWindowState(HWND hWnd, char *symnam)
{
str255 line;
WINDOWPLACEMENT w;
// ウィンドウ位置・状態取得
w.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hWnd, &w);
// ウィンドウ位置、状態保存(1〜4項目に位置、5項目にZoom状態)
if (w.showCmd == SW_SHOWMAXIMIZED) {
sprintf(line,"%d,%d,%d,%d,1",
w.rcNormalPosition.left,w.rcNormalPosition.bottom,
w.rcNormalPosition.right,w.rcNormalPosition.top);
}
else {
sprintf(line,"%d,%d,%d,%d,0",
w.rcNormalPosition.left,w.rcNormalPosition.bottom,
w.rcNormalPosition.right,w.rcNormalPosition.top);
}
set_symbol(symnam,line); // symnamで保存
}
void LoadWindowState(HWND hWnd, char *symnam)
{
WINDOWPLACEMENT w;
RECT rcWnd;
MONITORINFO mi;
str255 line;
// 既定のウィンドウ位置取得
w.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hWnd, &w);
get_rectsym(&rcWnd,symnam,&w.rcNormalPosition); // 1〜4項目の前回のWin位置を取得
// 対象モニタの情報を取得
HMONITOR hMonitor = MonitorFromRect(&rcWnd, MONITOR_DEFAULTTONEAREST);
mi.cbSize = sizeof(MONITORINFO);
GetMonitorInfo(hMonitor, &mi);
// 位置補正
if (rcWnd.right > mi.rcMonitor.right) {
rcWnd.left -= rcWnd.right - mi.rcMonitor.right;
rcWnd.right = mi.rcMonitor.right;
}
if (rcWnd.left < mi.rcMonitor.left) {
rcWnd.right += mi.rcMonitor.left - rcWnd.left;
rcWnd.left = mi.rcMonitor.left;
}
if (rcWnd.bottom > mi.rcMonitor.bottom) {
rcWnd.top -= rcWnd.bottom - mi.rcMonitor.bottom;
rcWnd.bottom = mi.rcMonitor.bottom;
}
if (rcWnd.top < mi.rcMonitor.top) {
rcWnd.bottom += mi.rcMonitor.top - rcWnd.top;
rcWnd.top = mi.rcMonitor.top;
}
// ウィンドウ位置復元
SetWindowPos(hWnd, NULL, rcWnd.left, rcWnd.top,
rcWnd.right - rcWnd.left, rcWnd.bottom - rcWnd.top, SWP_NOZORDER);
// ウィンドウ最大化状態復元 // 5項目の前回のZoom状態取得
get_dsym(line,symnam,",,,,0",255); // symnamから読出し
if (iitem(line,5)) ShowWindow(hWnd, SW_MAXIMIZE);
}
case WM_GETMINMAXINFO:
lpmm = (LPMINMAXINFO)lp;
lpmm->ptMinTrackSize.x = 100;
lpmm->ptMinTrackSize.y = 100;
lpmm->ptMaxTrackSize.x = 640;
lpmm->ptMaxTrackSize.y = 480;
break;
void InsColumn(HWND hWnd, char *str, int cx, int iSub)
{
LV_COLUMN col;
col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
col.fmt = LVCFMT_LEFT;
col.cx = cx;
col.pszText = str;
col.iSubItem = iSub;
ListView_InsertColumn(hWnd, iSub, &col);
return;
}
void InsItem(HWND hWnd, int item, char *str)
{
LV_ITEM itm;
itm.mask = LVIF_TEXT;
itm.pszText = str;
itm.iItem = item;
itm.iSubItem = 0;
ListView_InsertItem(hWnd, &itm);
return;
}
void SetSubitem(HWND hWnd, int item, int subitem, char *str)
{
LV_ITEM itm;
itm.mask = LVIF_TEXT;
itm.pszText = str;
itm.iItem = item;
itm.iSubItem = subitem;
ListView_SetItem(hWnd, &itm);
return;
}
void listview_delallcol(HWND hlistview)
{
int i,count;
//カラム数を求める
count = Header_GetItemCount(ListView_GetHeader(hlistview));
for (i=0; i<count ;i++) {
ListView_DeleteColumn(hlistview,0);
}
}
case WM_NOTIFY:
LPNMHDR lpnmhdr;
LPNMLVCUSTOMDRAW lplvcd;
lpnmhdr = (LPNMHDR)lp;
if (lpnmhdr->hwndFrom == g.hbtable) { // BINTABLEからのメッセージであることをチェック
switch ( lpnmhdr->code ) {
case NM_CUSTOMDRAW :
// ---- カスタムドローで、Listviewの色を設定。
lplvcd = (LPNMLVCUSTOMDRAW)lp;
switch (lplvcd->nmcd.dwDrawStage) {
case CDDS_PREPAINT: // 描画前にITEM情報をリクエスト
SetWindowLong(hWnd,DWL_MSGRESULT,(long)CDRF_NOTIFYITEMDRAW);
return TRUE;
case CDDS_ITEMPREPAINT: // ITEM描画前にSUBITEM情報をリクエスト
SetWindowLong(hWnd,DWL_MSGRESULT,(long)CDRF_NOTIFYSUBITEMDRAW);
return TRUE;
case CDDS_ITEMPREPAINT|CDDS_SUBITEM: // SUBITEM描画イベント
row = lplvcd->nmcd.dwItemSpec; // 行番号
col = lplvcd->iSubItem; // 列番号
ListView_GetItemText(g.hbtable,row,col,line,255);
i = atoi(line)*10%256;
lplvcd->clrTextBk = RGB(255,255-i,255-i); //値により色を設定
lplvcd->clrText = RGB(0, 0, 0);
SetWindowLong(hWnd,DWL_MSGRESULT,(long)CDRF_NEWFONT);
return TRUE;
}
break;
default :
break;
} // end of switch(lpnmhdr->code)
} // end of (hwndFrom == g.hbtable)
return TRUE;
カスタムドローは最初はうまく行かなかった。自分が引っ掛かったのは以下のようなこと。
ListView_SetItemCountEx( g.hbtable, 9999, LVSICF_NOINVALIDATEALL );
case WM_NOTIFY:
LPNMHDR lpnmhdr;
lpnmhdr = (LPNMHDR)lp;
if (lpnmhdr->hwndFrom == g.hbtable) { // BINTABLEからのメッセージであることをチェック
switch ( lpnmhdr->code ) {
case LVN_GETDISPINFO :
LV_DISPINFO *pLvDispInfo;
pLvDispInfo = (LV_DISPINFO*)lp;
TCHAR szString[MAX_PATH];
if (pLvDispInfo->item.mask & LVIF_TEXT) { // TEXTならば
col = pLvDispInfo->item.iSubItem; // 列番号
row = pLvDispInfo->item.iItem; // 行番号
wsprintf(szString,"%d,%d",col,row); // とりあえず列行を出力
if (lstrlen(szString) < pLvDispInfo->item.cchTextMax)
lstrcpy(pLvDispInfo->item.pszText,szString);
else
lstrcpy(pLvDispInfo->item.pszText,_T(""));
}
break;
default :
break;
} // end of switch(lpnmhdr->code)
} // end of (hwndFrom == g.hbtable)
return TRUE;
:
case WM_DRAWITEM: // オーナードロー
DrawListItem((LPDRAWITEMSTRUCT)lp);
return TRUE;
:
void DrawListItem(LPDRAWITEMSTRUCT lpDraw)
{
HWND hList; //リストビューのハンドル
HDC hdc; //デバイスコンテキスト
RECT rt;
HBRUSH hBrush; //背景描画用のブラシ
LVCOLUMN LvColumn; //列項目取得用の構造体
int SubItemNum;
int SubItem;
str255 Text;
hList=lpDraw->hwndItem;
hdc = lpDraw->hDC;
SaveDC(hdc); // デバイスコンテキスト保存
SetTextColor(hdc, RGB(0,0,255)); // 文字色を設定
//カラムヘッダ情報取得用
ZeroMemory(&LvColumn,sizeof(LvColumn));
LvColumn.mask=LVCF_FMT;
//列の数を取得する
SubItemNum=Header_GetItemCount(ListView_GetHeader(hList))-1;
//SubItemの表示
for (SubItem=0; SubItem<=SubItemNum ;SubItem++) {
//SubItemの大きさを取得
ListView_GetSubItemRect(hList,lpDraw->itemID,SubItem,LVIR_BOUNDS,&rt);
//カラムヘッダの情報取得
ListView_GetColumn(hList,SubItem,&LvColumn);
ListView_GetSubItemRect(hList,lpDraw->itemID,SubItem,LVIR_LABEL,&rt);
//アイテムの文字情報を取得
ListView_GetItemText(hList,lpDraw->itemID,SubItem,Text,sizeof(Text));
//背景色の塗潰し
hBrush = CreateSolidBrush(RGB((atoi(Text)%256)*10,0,0));
FillRect(hdc,&rt,hBrush);
DeleteObject( hBrush ); // 作成したブラシを廃棄
// SubItemを表示
DrawListItemText(hdc,Text,&rt,LvColumn.fmt);
}
//デバイスコンテキストを復帰
RestoreDC(hdc,-1);
}
LV_HITTESTINFO lvinfo;
LV_ITEM item;
str255 buf;
:
// WN_NOTIFYのLVN_ITEMCHANGED等の処理
GetCursorPos((LPPOINT)&lvinfo.pt);
ScreenToClient(((LPNMLISTVIEW)lp)->hdr.hwndFrom, &lvinfo.pt);
ListView_HitTest(((LPNMLISTVIEW)lp)->hdr.hwndFrom, &lvinfo);
if ((lvinfo.flags & LVHT_ONITEM) != 0) {
item.mask = TVIF_HANDLE | TVIF_TEXT;
item.iItem = lvinfo.iItem;
item.iSubItem = 0; // サブアイテム番号
item.pszText = buf; // テキストバッファ
item.cchTextMax = 255; // バッファ容量
ListView_GetItem(((LPNMLISTVIEW)lp)->hdr.hwndFrom, &item);
MessageBox(hWnd, buf,"Click", MB_OK);
}
ListView_SetItemState(g.hList, n, LVIS_SELECTED, LVIS_SELECTED)
ListView_SetItemState(g.hList, n, 0, LVIS_SELECTED)
ListView_SetItemState(g.hList, -1, LVIS_SELECTED, LVIS_SELECTED)
ListView_SetItemState(g.hList, -1, 0, LVIS_SELECTED)
data_n = ListView_GetItemCount(g.hList);
for (i = 0; i < data_n; i++) {
if (ListView_GetItemState(g.hList, i,LVIS_SELECTED)) {
// 選択行の処理
}
}
case WM_NOTIFY:
:
case NM_CUSTOMDRAW:
lplvcd = (LPNMLVCUSTOMDRAW)lp;
switch (lplvcd->nmcd.dwDrawStage) {
case CDDS_PREPAINT: // 描画前にITEM情報をリクエスト
SetWindowLong(hWnd, DWL_MSGRESULT, (long)CDRF_NOTIFYITEMDRAW);
break;
case CDDS_ITEMPREPAINT:
row = lplvcd->nmcd.dwItemSpec; // 行番号
if (ListView_GetItemState(g.hList, row, LVIS_SELECTED)) {
lplvcd->clrTextBk = RGB(0, 255, 255);
lplvcd->clrText = RGB(0, 0, 0);
SetWindowLong(hWnd, DWL_MSGRESULT, (long)CDRF_NEWFONT);
}
break;
}
break;
InvalidateRect(g.hList, NULL, TRUE);
DWORD dwStyleEx=0;
NM_LISTVIEW *pNMLV;
case WM_INITDIALOG: // Dialogの初期設定
// リストハンドルの取得
g.hList = GetDlgItem(hWnd,IDC_REGLIST);
// 1行選択と罫線の表示
dwStyleEx = ListView_GetExtendedListViewStyle( g.hList );
dwStyleEx |= ( LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_ONECLICKACTIVATE);
// dwStyleEx |= ( LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT );
ListView_SetExtendedListViewStyle( g.hList, dwStyleEx );
// 項目名の設定
InsColumn(g.hList,"名前",50,0);
InsColumn(g.hList,"内容",200,1);
InsColumn(g.hList,"設定",50,2);
// 行数の設定(データ数に合わせて設定しておく)
ListView_SetItemCountEx(g.hList, 9999, LVSICF_NOINVALIDATEALL );
// とりあえず、1行目を選択状態にしておく
ListView_SetItemState(g.hList,0,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED);
case WM_NOTIFY:
LPNMHDR lpnmhdr;
lpnmhdr = (LPNMHDR)lp;
switch(((LPNMHDR)lp)->idFrom) {
case IDC_REGLIST:
switch ( lpnmhdr->code ) {
case LVN_GETDISPINFO : // 仮想ListViewの表示データ問合せ
LV_DISPINFO *pLvDispInfo;
pLvDispInfo = (LV_DISPINFO*)lp;
TCHAR szString[MAX_PATH];
if (pLvDispInfo->item.mask & LVIF_TEXT) {
col = pLvDispInfo->item.iSubItem; // 列番号
row = pLvDispInfo->item.iItem; // 行番号
switch(col) {
case 0:
wsprintf(szString,"%s",d[row].name); // 名前をセット
break;
case 1:
wsprintf(szString,"%s",d[row].desc); // 内容をセット
break;
case 2:
wsprintf(szString,"%d",d[row].data); // 設定値をセット
break;
}
if (lstrlen(szString) < pLvDispInfo->item.cchTextMax)
lstrcpy(pLvDispInfo->item.pszText,szString); // 表示文字列を返す
else
lstrcpy(pLvDispInfo->item.pszText,_T("****")); // 文字列が大きすぎる場合
}
break;
// case LVN_ITEMCHANGED:
case LVN_ITEMACTIVATE:
row = ListView_GetNextItem(g.hList,-1,LVIS_SELECTED); // 選択行を求める
if (row!=-1)
printf(">%d\n",row);
break;
case LVN_COLUMNCLICK: // カラムヘッダ部のクリック
pNMLV = (NM_LISTVIEW *)lp;
printf(">col %d click\n",pNMLV->iSubItem);
break;
default :
break;
}
}
return TRUE;
CONTROL "List1",IDC_REGLIST,"SysListView32",LVS_REPORT |
LVS_OWNERDATA | WS_BORDER | WS_TABSTOP,131,23,216,154
case WM_KEYDOWN:
switch (wp) {
case VK_RIGHT:
// →キーの処理;
break;
case VK_LEFT:
// ←キーの処理;
break;
}
return TRUE;
skey = (GetAsyncKeyState(VK_SHIFT) && 0x8000);
ckey = (GetAsyncKeyState(VK_CONTROL) && 0x8000);
if (wp==VK_TAB) {
if (ckey) ;// CTRLキーとTABキーの同時押し処理
if (skey) ;// SHIFTキーとTABキーの同時押し処理
}
g.hHook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,NULL, GetWindowThreadProcessId(hWnd,NULL));
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wp, LPARAM lp)
{
//nCodeが0未満のときは、CallNextHookExが返した値を返す
if (nCode < 0) return CallNextHookEx(g.hHook,nCode,wp,lp);
if (nCode==HC_ACTION) {
//キーの遷移状態のビットをチェックして
//WM_KEYDOWNとWM_KEYUPをDialogに送信する
if ((lp & 0x80000000)==0) {
SendMessage(g.hDlg1,WM_KEYDOWN,wp,lp);
}
else {
SendMessage(g.hDlg1,WM_KEYUP,wp,lp);
}
}
return CallNextHookEx(g.hHook,nCode,wp,lp);
}
#pragma comment(lib, "unknown.lib")
#pragma comment(linker, "/delayload:unknown.dll")
> dumpbin /exports unknown.dll
:
ordinal hint name
1 0 UnknownFunc1 (00005424)
2 1 UnknownFunc2 (00005441)
Summary
:
LIBRARY unknown.dll
EXPORT
UnknownFunc1 →dumpbinで表示されたDLL関数名を列挙する
UnknownFunc2
>lib /def:unknown.def /machine:x86
DllCanUnloadNow
DllGetClassObject
DllRegisterServer
DllUnregisterServer
#include <commdlg.h>
:
BOOL openfile_dialog(HWND hWnd, TCHAR *defa_file, TCHAR *title, TCHAR *filter)
{
OPENFILENAME OpenFileName;
OpenFileName.lStructSize = sizeof(OPENFILENAME);
OpenFileName.hwndOwner = hWnd;
OpenFileName.hInstance = NULL;
OpenFileName.lpstrFilter = filter;
OpenFileName.lpstrCustomFilter = NULL;
OpenFileName.nMaxCustFilter = 0;
OpenFileName.nFilterIndex = 0;
OpenFileName.lpstrFile = defa_file;
OpenFileName.nMaxFile = 511;
OpenFileName.lpstrFileTitle = NULL;
OpenFileName.nMaxFileTitle = 0;
OpenFileName.lpstrInitialDir = NULL;
OpenFileName.lpstrTitle = title;
OpenFileName.nFileOffset = 0;
OpenFileName.nFileExtension = 0;
OpenFileName.lpstrDefExt = NULL;
OpenFileName.lCustData = NULL;
OpenFileName.Flags = OFN_EXPLORER | OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT;
return GetOpenFileName(&OpenFileName);
}
if (openfile_dialog(NULL,file_name,"ファイルOpen",
"設定ファイル(*.dat)\0*.dat\0AllFile(*.*)\0*.*\0\0")) {
// 読込み処理
}
BOOL savefile_dialog(HWND hWnd, TCHAR *defa_file, TCHAR *title, TCHAR *defext, TCHAR *filter)
{
OPENFILENAME OpenFileName;
OpenFileName.lStructSize = sizeof(OPENFILENAME);
OpenFileName.hwndOwner = hWnd;
OpenFileName.hInstance = NULL;
OpenFileName.lpstrFilter = filter;
OpenFileName.lpstrCustomFilter = NULL;
OpenFileName.nMaxCustFilter = 0;
OpenFileName.nFilterIndex = 0;
OpenFileName.lpstrFile = defa_file;
OpenFileName.nMaxFile = 511;
OpenFileName.lpstrFileTitle = NULL;
OpenFileName.nMaxFileTitle = 0;
OpenFileName.lpstrInitialDir = NULL;
OpenFileName.lpstrTitle = title;
OpenFileName.nFileOffset = 0;
OpenFileName.nFileExtension = 0;
OpenFileName.lpstrDefExt = defext; // 拡張子が指定されない場合のデフォルト拡張子
OpenFileName.lCustData = NULL;
OpenFileName.Flags = OFN_OVERWRITEPROMPT; // 上書きの確認をする
return GetSaveFileName(&OpenFileName);
}
if (savefile_dialog(NULL,file_name,"ファイル保存","dat",
"設定ファイル(*.dat)\0*.dat\0AllFile(*.*)\0*.*\0\0")) {
// 書込み処理
}
UINT CALLBACK FookFileDialog(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch(msg) {
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch(LOWORD(wp)){
case IDC_BUTTON1:
// ボタンの処理
return TRUE;
}
break;
}
return FALSE;
}
#include <shlobj.h>
int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
if (uMsg == BFFM_INITIALIZED){
SendMessage(hwnd, BFFM_SETSELECTION, (WPARAM)TRUE, lpData); //初期フォルダ設定
}
return 0;
}
void GetFolder(HWND hdlg)
{
char dst_file[MAX_PATH];
BROWSEINFO binfo;
LPITEMIDLIST idlist;
GetDlgItemText(hdlg, IDC_DESFILE, dst_file, MAX_PATH); //初期フォルダ読込み
binfo.hwndOwner = hdlg;
binfo.pidlRoot = NULL;
binfo.pszDisplayName = dst_file;
binfo.lpszTitle = "フォルダを指定してください";
binfo.ulFlags = BIF_RETURNONLYFSDIRS;
binfo.lpfn = &BrowseCallbackProc; //コールバック関数
binfo.lParam = (LPARAM)dst_file; //コールバックに渡す引数
binfo.iImage = (int)NULL;
idlist = SHBrowseForFolder(&binfo);
SHGetPathFromIDList(idlist, dst_file); //ITEMIDLISTからパスを得る
CoTaskMemFree(idlist); //ITEMIDLISTの解放
SetDlgItemText(hdlg, IDC_DESFILE, dst_file); //フォルダ名出力
}
char path[MAX_PATH] = { "C:\\*.*" };
:
case WM_INITDIALOG:
DlgDirList(hWnd, path, IDC_LISTBOX1, IDC_EDIT1, DDL_DIRECTORY | DDL_DRIVES); // ドライブ名も表示する
break;
case WM_COMMAND:
switch(LOWORD(wp)) {
case IDC_LIST1:
if (HIWORD(WP) == LBN_DBLCLK) {
if (DlgDirSelectEx(hWnd,path,sizeof(path),IDC_LISTBOX1)) {
strcat_s(path,"*.*");
DlgDirList(hWnd,path,IDC_LISTBOX1,IDC_EDIT1,DDL_DIRECTORY | DDL_DRIVES);
}
}
break;
int filelist(char *path)
{
WIN32_FIND_DATA fd;
HANDLE hFind;
FILETIME ft;
SYSTEMTIME st;
int i=0;
hFind = FindFirstFile(path, &fd);
while (hFind != INVALID_HANDLE_VALUE) {
if (fd.cFileName[0] != '.') {
strcpy_s(d[i].fname, fd.cFileName); // ファイル名
if (!(fd.dwFileAttributes&(FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_SYSTEM)))
d[i].fsize = (fd.nFileSizeHigh << 6) + ((fd.nFileSizeLow + 1023) >> 10); // ファイルサイズ[KB]
//d[i].fsize = fd.nFileSizeHigh*MAXDWORD + fd.nFileSizeLow; // ファイルサイズ
FileTimeToLocalFileTime(&(fd.ftLastWriteTime), &ft);
FileTimeToSystemTime(&ft, &st);
wsprintf(d[i].fdate, "%04d/%02d/%02d %02d:%02d",
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute); // ファイル日付
i++;
}
if (!FindNextFile(hFind, &fd)) break;
}
FindClose(hFind);
return i;
}
#include <shellapi.h>
:
ShellExecute(NULL,NULL,"notepad",file_name,NULL,SW_SHOWNORMAL);
ShellExecute(NULL,NULL,"https://bluefish.orz.hm/",NULL,NULL,SW_SHOWNORMAL);
SendMessage(GetDlgItem(hWnd, IDC_INTERVAL_C), UDM_SETBUDDY, (WPARAM)GetDlgItem(hWnd, IDC_INTERVAL), 0); // 対応するEditBox指定
SendMessage(GetDlgItem(hWnd, IDC_INTERVAL_C), UDM_SETRANGE, (WPARAM)0, (LPARAM)MAKELONG(8,1)); // 範囲指定
SendMessage(GetDlgItem(hWnd, IDC_INTERVAL_C), UDM_SETPOS, 0, (LPARAM)MAKELONG((short)g.interval, 0)); // 初期値の指定