約 2,512,744 件
https://w.atwiki.jp/sampleisbest/pages/280.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Win32 プロジェクト プロジェクト名 ShellExec アプリケーションの種類 Windows アプリケーション 追加のオプション 空のプロジェクト 文字セット Unicode ShellExec.cpp // ShellExec 指定されたファイルに対し、指定された操作を実行 #include Windows.h #include "resource.h" // 関数プロトタイプ宣言 INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); void OnOK(HWND hDlg); //============================================================================== int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) { DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, DlgProc); return 0; } INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { INT_PTR result = TRUE;// メッセージを処理した switch (uMsg) { case WM_COMMAND switch (LOWORD(wParam)) { case IDOK OnOK(hDlg); break; case IDCANCEL EndDialog(hDlg, IDCANCEL); break; } break; case WM_INITDIALOG result = TRUE;// SetFocusでフォーカスを設定した場合はFALSE break; case WM_CLOSE EndDialog(hDlg, 0); break; default result = FALSE;// メッセージを処理しなかった } return result; } void OnOK(HWND hDlg) { TCHAR cmd[256]; GetDlgItemText(hDlg, IDC_EDIT, cmd, _countof(cmd)); ShellExecute(hDlg, NULL, cmd, NULL, NULL, SW_SHOWNORMAL); } resource.h #define IDD_DIALOG100 #define IDC_STATIC-1 #define IDC_EDIT1000 ShellExec.rc // resource script #include Windows.h #include "resource.h" IDD_DIALOG DIALOGEX 100, 100, 320, 100 STYLE WS_POPUPWINDOW | WS_MINIMIZEBOX EXSTYLE WS_EX_APPWINDOW CAPTION "ShellExec" FONT 9, "MS Pゴシック" BEGIN LTEXT"Command( C) ",IDC_STATIC,10,10,50,12 EDITTEXTIDC_EDIT,60,10,200,12,ES_AUTOHSCROLL DEFPUSHBUTTON"OK",IDOK,260,75,50,15 END
https://w.atwiki.jp/sampleisbest/pages/547.html
vsync2.asm comment * MASM32 SDK ml /c /AT /Fl vsync2.asm link16 /t vsync2; * .modeltiny TABLEequ0028h; VSYNC VRAMSEGequ0a000h CLSequ1ah ESCAPEequ1bh .code org0100h mainproc movah, 02h movdl, CLS int21h callsetvect out64h, al; VSYNCリセット @@loop calldisp movah, 0bh; キーボードのステータスチェック int21h cmpal, 0 je@@loop movah, 07h; コンソールからの直接入力 int21h cmpal, ESCAPE jne@@loop callresvect movax, 4c00h int21h mainendp myint0aprocfar sti inccs count out64h, al; VSYNCリセット jmpcs [vect] ;iret myint0aendp setvectproc cli movax, 0000h moves, ax movsi, TABLE movax, es [si] movvect_off, ax movax, es [si+2] movvect_seg, ax movax, offset myint0a moves [si], ax movax, cs; = seg myint0a moves [si+2], ax inal, 02h andal, 0fbh; VSYNC割り込みマスク on out02h, al jmp$+2 sti ret setvectendp resvectproc cli inal, 02h oral, 04h; VSYNC割り込みマスク off out02h, al movax, 0000h moves, ax movsi, TABLE movax, vect_off moves [si], ax movax, vect_seg moves [si+2], ax jmp$+2 sti ret resvectendp dispproc movah, 00h; 日付・時刻の読み出し pushcs popes movbx, offset clock int1ch; カレンダ時計のBIOS moval, clock[5] cmpal, sec je@@skip movsec, al movax, count movdx, ax subax, fps movfps, dx movdi, offset buf calltodec5 @@skip movax, count movdi, offset buf + 6 calltodec5 movax, VRAMSEG moves, ax movsi, offset buf movdi, 0 cld movah, 0 movcx, 11 @@loop lodsb stosw loop@@loop ret dispendp ; ax=数値 di=バッファ todec5proc adddi, 5 movbx, 10 movcx, 5 @@loop movdx, 0 divbx adddl, 0 decdi mov[di], dl loop@@loop ret todec5endp vectlabeldword vect_offdw? vect_segdw? secdb-1 fpsdw0 countdw0 clockdb6 dup (?) bufdb xxxxx xxxxx endmain
https://w.atwiki.jp/sampleisbest/pages/180.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 空の CLR プロジェクト プロジェクト名 ClrD3D 参考 ライト(Light) ClrD3D_26.cpp /* #26 メッシュとライト プロジェクトへの参照の追加(参照タブ) C \WINDOWS\Microsoft.NET\DirectX for Managed Code\1.0.2902.0 Microsoft.DirectX.dll Microsoft.DirectX.Direct3D.dll Microsoft.DirectX.Direct3DX.dll */ #pragma comment(linker, "/subsystem windows /entry main") // アセンブリ #using System.dll #using System.Drawing.dll #using System.Windows.Forms.dll // 名前空間 using namespace System; using namespace System Drawing; using namespace System Threading; using namespace System Windows Forms; using namespace Microsoft DirectX; using namespace Microsoft DirectX Direct3D; ref class MainForm Form { private Device^ dev; PresentParameters^ pp; Mesh^ meshBox; Mesh^ meshSphere; float fDist;// 原点との距離 float fAlt;// 高度 int nCamAngle;// カメラの方位角 public MainForm() { MinimumSize = Drawing Size(80, 60); ClientSize = Drawing Size(800, 600); Text = "ClrD3D"; fDist = 5.0f; fAlt = 2.0f; nCamAngle = 210; KeyDown += gcnew KeyEventHandler(this, MainForm OnKeyDown); } bool DXInitialize() { try { pp = gcnew PresentParameters; pp- Windowed = true; pp- SwapEffect = SwapEffect Discard; pp- AutoDepthStencilFormat = DepthFormat D16; pp- EnableAutoDepthStencil = true; dev = gcnew Device(0, DeviceType Hardware, this, CreateFlags HardwareVertexProcessing, pp); CreateMesh(); return true; } catch (Exception^) { return false; } } void Render() { if (dev == nullptr) return; if (WindowState == FormWindowState Minimized) return; dev- RenderState- ZBufferEnable = true; dev- RenderState- ZBufferWriteEnable = true; // カメラの設定 float fRad = nCamAngle * (float)Math PI / 180; float fPosX = (float)Math Sin(fRad) * fDist; float fPosZ = (float)Math Cos(fRad) * fDist; dev- Transform- View = Matrix LookAtLH( Vector3(fPosX, fAlt, fPosZ), Vector3( 0.0f, 0.0f, 0.0f), Vector3( 0.0f, 1.0f, 0.0f)); dev- Transform- Projection = Matrix PerspectiveFovLH((float)Math PI / 4, (float)ClientSize.Width / (float)ClientSize.Height, 0.1f, 100.0f); // ライトの設定 //dev- RenderState- Lighting = false; dev- RenderState- Ambient = Color FromArgb(0x00,0x00,0x7f); dev- Lights[0]- Type = LightType Directional; dev- Lights[0]- Direction = Vector3 Normalize(Vector3(1, -2, 3)); dev- Lights[0]- Ambient = Color FromArgb(0x00,0x7f,0x00); dev- Lights[0]- Diffuse = Color FromArgb(0xff,0x00,0x00); dev- Lights[0]- Enabled = true; dev- Lights[0]- Update(); dev- Clear(ClearFlags Target | ClearFlags ZBuffer, 0x7f7fff, 1.0f, 0); dev- BeginScene(); // メッシュ描画 Material mat; mat.AmbientColor = ColorValue(1.0f, 1.0f, 1.0f); mat.DiffuseColor = ColorValue(1.0f, 1.0f, 1.0f); dev- Material = mat; dev- Transform- World = Matrix Translation(Vector3(-1.0f, 0.0f, 0.0f)); meshBox- DrawSubset(0); dev- Transform- World = Matrix Translation(Vector3( 1.0f, 0.0f, 0.0f)); meshSphere- DrawSubset(0); dev- EndScene(); try { dev- Present(); } catch (DeviceLostException^) { ResetDevice(); } } private void CreateMesh() { meshBox = Mesh Box(dev, 1, 1, 1); meshSphere = Mesh Sphere(dev, 0.5f, 16, 8); } void ResetDevice() { int hResult; if (!dev- CheckCooperativeLevel(hResult)) { switch (hResult) { case ResultCode DeviceLost Thread Sleep(10); break; case ResultCode DeviceNotReset dev- Reset(pp); break; } } } void OnKeyDown(Object^ sender, KeyEventArgs^ e) { switch (e- KeyCode) { case Keys W fDist -= 0.5f; break; case Keys S fDist += 0.5f; break; case Keys Up fAlt += 0.5f; break; case Keys Down fAlt -= 0.5f; break; case Keys Left nCamAngle += 5; break; case Keys Right nCamAngle -= 5; break; case Keys Escape Close(); break; } } }; int main() { MainForm^ form = gcnew MainForm; if (!form- DXInitialize()) { MessageBox Show("Direct3Dの初期化に失敗しました。", "ClrD3D"); return 0; } form- Show(); while (form- Created) { form- Render(); Application DoEvents(); } return 0; }
https://w.atwiki.jp/sampleisbest/pages/165.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Win32 プロジェクト プロジェクト名 PrnAddr アプリケーションの種類 Windows アプリケーション 追加のオプション 空のプロジェクト 文字セット マルチバイト 注意 元のファイルが失われる恐れがあるので、必要なファイルは必ずバックアップを取ってください。 PrnAddr.cpp // マルチバイト #include Windows.h #include CommCtrl.h #include tchar.h #include sqlext.h #include stdio.h #include "resource.h" #define WIDTH(rect) ((rect).right - (rect).left) #define HEIGHT(rect) ((rect).bottom - (rect).top) #define LTRB(rect) (rect).left, (rect).top, (rect).right, (rect).bottom #define DRIVER _T("Microsoft Text Driver (*.txt; *.csv)") #define APPNAME _T("PrnAddr") // 関数プロトタイプ宣言 BOOL SplitPath(LPCTSTR pszPath); void Trace(LPCTSTR format, ...); void DigitOnly(LPTSTR pszStr); INT_PTR CALLBACK MainDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); void OnInitDialog(HWND hDlg); void OnDropFiles(HWND hDlg, WPARAM wParam); BOOL OnClose(HWND hDlg); BOOL CheckRecMod(HWND hWnd); void OnCommand(HWND hDlg, WPARAM wParam, LPARAM lParam); void OnUpdate(void); void OnDrawItem(WPARAM wParam, LPARAM lParam); void OnDraw(HDC hdc, int nRec, BOOL bGuide); void DrawField(HDC hdc, PRECT prc, int nRow, int nCol, BOOL bGuide, LPCTSTR pszSuffix); void OnPrint(HWND hDlg, int nMode); void CopyRecord(void); void ShowSubDlg(void); int lmpx(int lm); int lmpy(int lm); int lmpw(int lm); int lmph(int lm); INT_PTR CALLBACK SubDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); void OnCheck(HWND hDlg); void OnSave(HWND hDlg); void OnSubPrint(HWND hDlg); void OnSubInitDialog(HWND hDlg); void InitAddress(HWND hWnd); void LoadTable(HWND hWnd); BOOL SaveTable(HWND hWnd); BOOL CreateCsvFile(HWND hWnd, LPCTSTR pszPath); // 外部変数構造体 static struct { HINSTANCE hInstance; HWND hMainDlg;// メインダイアログ HWND hSubDlg;// 住所録ダイアログ HWND hRec;// レコードエディットハンドル HWND hSpin;// スピンコントロールハンドル HWND hUpdate;// 更新ボタンハンドル HWND hList;// リストビューハンドル HGLOBAL hDevMode;// デバイスモード構造体ハンドル HGLOBAL hDevNames;// デバイス名構造体ハンドル SQLHENV henv;// 環境ハンドル TCHAR szDbq[MAX_PATH];// データベースディレクトリ TCHAR szTable[MAX_PATH];// CSVファイル int nRecNum;// レコード数 int nRec;// 対象レコード BOOL bRecMod;// レコード変更フラグ BOOL bTableMod;// テーブル変更フラグ // デバイス能力 int nHorzRes; int nVertRes; int nPhysicalWidth; int nPhysicalHeight; int nPhysicalOffsetX; int nPhysicalOffsetY; int nLogPixelsX; int nLogPixelsY; } g; //============================================================================== int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) { g.hInstance = hInstance; // ODBC環境ハンドルの確保 SQLRETURN rc;// retcode rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, g.henv); rc = SQLSetEnvAttr(g.henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0); // コマンド引数の取得 LPWSTR pszCmdLine = GetCommandLineW(); int argc; LPWSTR *argv = CommandLineToArgvW(pszCmdLine, argc); if (2 = argc) { TCHAR szPath[MAX_PATH]; wcstombs_s(NULL, szPath, argv[1], _TRUNCATE); SplitPath(szPath); } LocalFree(argv); DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, MainDlgProc); HGLOBAL hr; hr = GlobalFree(g.hDevMode); hr = GlobalFree(g.hDevNames); rc = SQLFreeHandle(SQL_HANDLE_ENV, g.henv); return 0; } //------------------------------------------------------------------------------ BOOL SplitPath(LPCTSTR pszPath) { TCHAR szDrive[_MAX_DRIVE]; TCHAR szDir[_MAX_DIR]; TCHAR szFName[_MAX_FNAME]; TCHAR szExt[_MAX_EXT]; _splitpath_s(pszPath, szDrive, szDir, szFName, szExt); _makepath_s(g.szDbq, szDrive, szDir, NULL, NULL); _makepath_s(g.szTable, NULL, NULL, szFName, szExt); return TRUE; } //------------------------------------------------------------------------------ void Trace(LPCTSTR format, ...) { va_list arg_ptr; TCHAR buffer[256]; int size; va_start(arg_ptr, format); size = _vsntprintf_s(buffer, _TRUNCATE, format, arg_ptr); va_end(arg_ptr); OutputDebugString(buffer); if (size 0) { OutputDebugString(_T("...\n")); } } //------------------------------------------------------------------------------ void DigitOnly(LPTSTR pszStr) { LPTSTR psz; TCHAR c; for (psz = pszStr; c = *pszStr; pszStr++) { if (_istdigit(c)) { *psz++ = c; } } *psz = c; } //============================================================================== INT_PTR CALLBACK MainDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { INT_PTR nRet = TRUE;// メッセージを処理した switch (uMsg) { case WM_COMMAND OnCommand(hDlg, wParam, lParam); break; case WM_DRAWITEM OnDrawItem(wParam, lParam); break; case WM_DROPFILES OnDropFiles(hDlg, wParam); DragFinish((HDROP)wParam); break; case WM_INITDIALOG OnInitDialog(hDlg); nRet = TRUE;// SetFocusでフォーカスを設定した場合はFALSE break; case WM_CLOSE if (OnClose(hDlg)) { EndDialog(hDlg, 0); } break; default nRet = FALSE;// メッセージを処理しなかった } return nRet; } //------------------------------------------------------------------------------ void OnInitDialog(HWND hDlg) { g.hMainDlg = hDlg; g.hRec= GetDlgItem(hDlg, IDC_RECORD); g.hSpin= GetDlgItem(hDlg, IDC_SPIN); g.hUpdate= GetDlgItem(hDlg, IDC_UPDATE); SendMessage(g.hSpin, UDM_SETBUDDY, (WPARAM)g.hRec, 0); g.hSubDlg = CreateDialog(g.hInstance, MAKEINTRESOURCE(IDD_SUB), hDlg, SubDlgProc); } //------------------------------------------------------------------------------ void OnDropFiles(HWND hDlg, WPARAM wParam) { HDROP hDrop = (HDROP)wParam; TCHAR szPath[MAX_PATH]; UINT ur = DragQueryFile(hDrop, 0, szPath, _countof(szPath)); SplitPath(szPath); ListView_DeleteAllItems(g.hList); InitAddress(hDlg); InvalidateRect(GetDlgItem(hDlg, IDC_PREVIEW), NULL, FALSE); } //------------------------------------------------------------------------------ BOOL OnClose(HWND hDlg) { BOOL bRet = TRUE; // レコード変更の確認 if (CheckRecMod(hDlg) == FALSE) return FALSE; // テーブル変更の確認 if (g.bTableMod == FALSE) return TRUE; int nr = MessageBox(hDlg, _T("住所録の内容は変更されています。\n\n保存しますか?"), APPNAME, MB_YESNOCANCEL | MB_ICONWARNING); switch (nr) { case IDYES bRet = SaveTable(hDlg); break; case IDNO break; default bRet = FALSE; } return bRet; } //------------------------------------------------------------------------------ BOOL CheckRecMod(HWND hWnd) { if (g.bRecMod == FALSE) return TRUE; int nr = MessageBox(hWnd, _T("レコードの内容は変更されています。\n\n更新しますか?"), APPNAME, MB_YESNOCANCEL | MB_ICONWARNING); switch (nr) { case IDYES OnUpdate(); break; case IDNO break; default return FALSE; } return TRUE; } //------------------------------------------------------------------------------ void OnCommand(HWND hDlg, WPARAM wParam, LPARAM lParam) { WORD wNotifyCode = HIWORD(wParam); WORD wID = LOWORD(wParam); HWND hwndCtl = (HWND)lParam; switch (wID) { case IDC_ADDRESS // 住所録 ShowSubDlg(); break; case IDC_PRINT // 単票印刷 if (CheckRecMod(hDlg)) { OnPrint(hDlg, 0); } break; case IDC_UPDATE // 更新 OnUpdate(); break; case IDCANCEL // 終了 SendMessage(hDlg, WM_CLOSE, 0, 0); break; } if (wNotifyCode == EN_CHANGE) { if (hwndCtl == g.hRec) { int nRec = max(SendMessage(g.hSpin, UDM_GETPOS, 0, 0) - 1, 0); if (nRec == g.nRec) return; if (CheckRecMod(hDlg)) { g.nRec = nRec; CopyRecord(); InvalidateRect(GetDlgItem(hDlg, IDC_PREVIEW), NULL, FALSE); } else { SendMessage(g.hSpin, UDM_SETPOS, 0, g.nRec + 1); } } else { if (g.bRecMod == FALSE) { g.bRecMod = TRUE; EnableWindow(g.hUpdate, g.bRecMod); } } } } //------------------------------------------------------------------------------ void OnUpdate(void) { TCHAR szBuf[256]; if (g.nRecNum = g.nRec) return; for (int n = 0; n 6; n++) { GetDlgItemText(g.hMainDlg, IDC_FIELD0 + n, szBuf, _countof(szBuf)); ListView_SetItemText(g.hList, g.nRec, n, szBuf); } g.bTableMod = TRUE; g.bRecMod = FALSE; EnableWindow(g.hUpdate, g.bRecMod); InvalidateRect(GetDlgItem(g.hMainDlg, IDC_PREVIEW), NULL, FALSE); } //------------------------------------------------------------------------------ void OnDrawItem(WPARAM wParam, LPARAM lParam) { LPDRAWITEMSTRUCT pdi = (LPDRAWITEMSTRUCT)lParam; HDC hdc = pdi- hDC; // 背景塗り潰し RECT rc; GetClientRect(pdi- hwndItem, rc); FillRect(hdc, rc, GetSysColorBrush(COLOR_WINDOW)); Trace(_T("OnDrawItem(%u) %d, %d, %d, %d\n"), wParam, LTRB(rc)); // デバイス能力 g.nPhysicalWidth= WIDTH(rc); g.nPhysicalHeight= HEIGHT(rc); g.nPhysicalOffsetX= 0; g.nPhysicalOffsetY= 0; // 背景 SetRect( rc, lmpx(0), lmpy(0), lmpx(300), lmpy(570)); FillRect(hdc, rc, GetSysColorBrush(COLOR_BTNFACE)); SetRect( rc, lmpx(0), lmpy(1250), lmpx(1000), lmpy(1480)); FillRect(hdc, rc, GetSysColorBrush(COLOR_BTNFACE)); int nRec = SendMessage(g.hSpin, UDM_GETPOS, 0, 0); OnDraw(hdc, nRec - 1, TRUE); } //------------------------------------------------------------------------------ void OnDraw(HDC hdc, int nRec, BOOL bGuide) { TCHAR szBuf[256]; HFONT hFont[3]; RECT rc; SetBkMode(hdc, TRANSPARENT);// 背景透過モード Trace(_T("OnDraw(%d)\n"), nRec); // 補助線 HPEN hPen = CreatePen(PS_SOLID, 0, RGB(0xff,0x00,0x00)); HGDIOBJ hPenOld = SelectObject(hdc, hPen); // 郵便番号 LOGFONT lf; ZeroMemory( lf, sizeof lf); lf.lfCharSet= DEFAULT_CHARSET; lf.lfHeight= -lmph(60); _tcscpy_s(lf.lfFaceName, _T("MS ゴシック")); hFont[0] = CreateFontIndirect( lf); HGDIOBJ hFontOld = SelectObject(hdc, hFont[0]); SetRect( rc, lmpx(440), lmpy(120), lmpx(930), lmpy(200)); if (bGuide) { Rectangle(hdc, LTRB(rc)); } if (nRec g.nRecNum) { ListView_GetItemText(g.hList, nRec, 2, szBuf, _countof(szBuf)); DigitOnly(szBuf); // 440, 510, 580, 650, 720, 790, 860 for (size_t n = 0; n _tcslen(szBuf); n++) { rc.right = rc.left + lmpw(70); DrawText(hdc, szBuf + n, 1, rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER); rc.left = rc.right; } } // 住所 lf.lfEscapement= 2700; lf.lfOrientation= 2700; lf.lfHeight= -lmph(60); _tcscpy_s(lf.lfFaceName, _T("@MS 明朝")); hFont[1] = CreateFontIndirect( lf); SelectObject(hdc, hFont[1]); SetRect( rc, lmpx(850-70), lmpy(300), lmpx(850), lmpy(1230)); DrawField(hdc, rc, nRec, 3, bGuide, NULL); SetRect( rc, lmpx(780-70), lmpy(400), lmpx(780), lmpy(1230)); DrawField(hdc, rc, nRec, 4, bGuide, NULL); SetRect( rc, lmpx(710-70), lmpy(400), lmpx(710), lmpy(1230)); DrawField(hdc, rc, nRec, 5, bGuide, NULL); // 氏名・連名 lf.lfHeight= -lmph(90); hFont[2] = CreateFontIndirect( lf); SelectObject(hdc, hFont[2]); SetRect( rc, lmpx(520-100), lmpy(400), lmpx(520), lmpy(1230)); DrawField(hdc, rc, nRec, 0, bGuide, _T("様")); SetRect( rc, lmpx(420-100), lmpy(400), lmpx(420), lmpy(1230)); DrawField(hdc, rc, nRec, 1, bGuide, _T("様")); // 終了処理 SelectObject(hdc, hFontOld); for (int n = 0; n _countof(hFont); n++) { DeleteObject(hFont[n]); } SelectObject(hdc, hPenOld); DeleteObject(hPen); } //------------------------------------------------------------------------------ void DrawField(HDC hdc, PRECT prc, int nRow, int nCol, BOOL bGuide, LPCTSTR pszSuffix) { TCHAR szText[64]; if (bGuide) { Rectangle(hdc, LTRB(*prc)); } if (g.nRecNum = nRow) return; ListView_GetItemText(g.hList, nRow, nCol, szText, _countof(szText)); if (szText[0]) { if (pszSuffix) { _tcscat_s(szText, pszSuffix); } TextOut(hdc, prc- right, prc- top, szText, _tcslen(szText)); } } //------------------------------------------------------------------------------ void OnPrint(HWND hDlg, int nMode) { PRINTDLGEX pd; LPDEVMODE pdm; LPDEVNAMES pdn; HRESULT hr; BOOL br; HDC hdc = NULL; // 印刷ダイアログ ZeroMemory( pd, sizeof pd); pd.lStructSize= sizeof pd; pd.hwndOwner= hDlg; pd.hDevMode= g.hDevMode; pd.hDevNames= g.hDevNames; pd.Flags= PD_NOPAGENUMS; pd.nStartPage= START_PAGE_GENERAL; hr = PrintDlgEx( pd); if (FAILED(hr)) { goto Exit; } g.hDevMode = pd.hDevMode; g.hDevNames = pd.hDevNames; if (pd.dwResultAction != PD_RESULT_PRINT) { goto Exit; } // プリンタ準備 pdm = (LPDEVMODE)GlobalLock(g.hDevMode); pdn = (LPDEVNAMES)GlobalLock(g.hDevNames); pdm- dmOrientation = DMORIENT_PORTRAIT; hdc = CreateDC(NULL, (LPCTSTR)pdn + pdn- wDeviceOffset, NULL, pdm); br = GlobalUnlock(g.hDevNames); br = GlobalUnlock(g.hDevMode); // デバイス能力の取得 g.nHorzRes= GetDeviceCaps(hdc, HORZRES); g.nVertRes= GetDeviceCaps(hdc, VERTRES); g.nPhysicalWidth= GetDeviceCaps(hdc, PHYSICALWIDTH); g.nPhysicalHeight= GetDeviceCaps(hdc, PHYSICALHEIGHT); g.nPhysicalOffsetX= GetDeviceCaps(hdc, PHYSICALOFFSETX); g.nPhysicalOffsetY= GetDeviceCaps(hdc, PHYSICALOFFSETY); g.nLogPixelsX= GetDeviceCaps(hdc, LOGPIXELSX); g.nLogPixelsY= GetDeviceCaps(hdc, LOGPIXELSY); // 用紙サイズを確認 SIZE size; size.cx = g.nPhysicalWidth * 254 / g.nLogPixelsX; size.cy = g.nPhysicalHeight * 254 / g.nLogPixelsY; Trace(_T("OnPrint %d %d\n"), size.cx, size.cy); if (100 abs(size.cx - 1000) || 100 abs(size.cy - 1480)) { MessageBox(hDlg, _T("用紙サイズを確認してください。"), NULL, MB_OK); goto Exit; } // 印刷開始 DOCINFO di; ZeroMemory( di, sizeof di); di.cbSize= sizeof di; di.lpszDocName= APPNAME; int nr = StartDoc(hdc, di); switch (nMode) { case 0 // 単票 nr = StartPage(hdc); int nRec; nRec = SendMessage(g.hSpin, UDM_GETPOS, 0, 0); OnDraw(hdc, nRec - 1, TRUE); nr = EndPage(hdc); break; case 1 // 連続 for (int n = 0; n g.nRecNum; n++) { br = ListView_GetCheckState(g.hList, n); if (br) { nr = StartPage(hdc); OnDraw(hdc, n, TRUE); nr = EndPage(hdc); } } break; } // 印刷終了 nr = EndDoc(hdc); Exit if (hdc) { DeleteDC(hdc); } } //------------------------------------------------------------------------------ void CopyRecord(void) { TCHAR szBuf[256]; Trace(_T("CopyRecord %d %d\n"), g.nRec, g.nRecNum); if (g.nRecNum = g.nRec) return; for (int n = 0; n 6; n++) { ListView_GetItemText(g.hList, g.nRec, n, szBuf, _countof(szBuf)); SetDlgItemText(g.hMainDlg, IDC_FIELD0 + n, szBuf); } g.bRecMod = FALSE; EnableWindow(g.hUpdate, g.bRecMod); } //------------------------------------------------------------------------------ void ShowSubDlg(void) { ShowWindow(g.hSubDlg, IsWindowVisible(g.hSubDlg) ? SW_HIDE SW_SHOW); } //------------------------------------------------------------------------------ // 0.1mm単位をピクセルに変換 // LoMetric to Pixel X int lmpx(int lm) { return lmpw(lm) - g.nPhysicalOffsetX; } // LoMetric to Pixel Y int lmpy(int lm) { return lmph(lm) - g.nPhysicalOffsetY; } // LoMetric to Pixel Width int lmpw(int lm) { return lm * g.nPhysicalWidth / 1000; } // LoMetric to Pixel Height int lmph(int lm) { return lm * g.nPhysicalHeight / 1480; } //============================================================================== INT_PTR CALLBACK SubDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { INT_PTR nRet = TRUE;// メッセージを処理した switch (uMsg) { case WM_COMMAND switch (LOWORD(wParam)) { case IDC_CHECK // 全てチェック/解除 OnCheck(hDlg); break; case IDC_SAVE // 保存 OnSave(hDlg); break; case IDC_PRINT // 連続印刷 OnSubPrint(hDlg); break; case IDCANCEL // 閉じる ShowSubDlg(); break; } break; case WM_INITDIALOG OnSubInitDialog(hDlg); nRet = TRUE;// SetFocusでフォーカスを設定した場合はFALSE break; case WM_CLOSE ShowSubDlg(); break; default nRet = FALSE;// メッセージを処理しなかった } return nRet; } //------------------------------------------------------------------------------ void OnCheck(HWND hDlg) { UINT ur = IsDlgButtonChecked(hDlg, IDC_CHECK); BOOL bCheck = (ur == BST_CHECKED); for (int n = 0; n g.nRecNum; n++) { ListView_SetCheckState(g.hList, n, bCheck); } } //------------------------------------------------------------------------------ void OnSave(HWND hDlg) { if (g.bTableMod == FALSE) return; int nr = MessageBox(hDlg, _T("住所録を保存しますか?"), APPNAME, MB_YESNO | MB_ICONQUESTION); if (nr == IDYES) { SaveTable(hDlg); } } //------------------------------------------------------------------------------ void OnSubPrint(HWND hDlg) { BOOL br = FALSE; for (int n = 0; n g.nRecNum; n++) { br = ListView_GetCheckState(g.hList, n); if (br) break; } if (br == FALSE) { MessageBox(hDlg, _T("印刷するレコードにチェックを付けてください。"), APPNAME, MB_OK); return; } OnPrint(hDlg, 1); } //------------------------------------------------------------------------------ void OnSubInitDialog(HWND hDlg) { RECT rc; GetClientRect(hDlg, rc); Trace(_T("OnInitDialog %d, %d, %d, %d\n"), LTRB(rc)); // リストビュー拡張スタイル g.hList = GetDlgItem(hDlg, IDC_LIST); DWORD dwExStyle = ListView_GetExtendedListViewStyle(g.hList); dwExStyle |= LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES; ListView_SetExtendedListViewStyle(g.hList, dwExStyle); InitAddress(hDlg); } //------------------------------------------------------------------------------ void InitAddress(HWND hWnd) { // テーブルの読み込み LoadTable(hWnd); g.nRecNum = ListView_GetItemCount(g.hList); g.nRec = 0; CopyRecord(); SendMessage(g.hSpin, UDM_SETRANGE32, 1, g.nRecNum); SendMessage(g.hSpin, UDM_SETPOS, 0, MAKELONG(1, 0)); } //------------------------------------------------------------------------------ void LoadTable(HWND hWnd) { TCHAR buf[256]; SQLHDBC hdbc;// 接続ハンドル SQLHSTMT hstmt;// 命令ハンドル SQLSMALLINT col; SQLSMALLINT n; SQLSMALLINT datatype; SQLLEN len; SQLRETURN rc;// retcode // データベースへの接続 _stprintf_s(buf, _T("driver={%s}; dbq=%s"), DRIVER, g.szDbq); rc = SQLAllocHandle(SQL_HANDLE_DBC, g.henv, hdbc); rc = SQLDriverConnect(hdbc, NULL, (SQLTCHAR *)buf, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT); if (!SQL_SUCCEEDED(rc)) { goto Exit; } // 検索 _stprintf_s(buf, _T("select * from %s"), g.szTable); rc = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, hstmt); rc = SQLExecDirect(hstmt, (SQLTCHAR *)buf, SQL_NTS); if (!SQL_SUCCEEDED(rc)) { goto Exit; } // 列情報 LV_COLUMN lvCol; lvCol.mask= LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvCol.fmt= LVCFMT_LEFT; lvCol.cx= 100; rc = SQLNumResultCols(hstmt, col); for (n = 0; n col; n++) { rc = SQLDescribeCol(hstmt, n+1, (SQLTCHAR *)buf, _countof(buf), NULL, datatype, NULL, NULL, NULL); lvCol.pszText= buf; lvCol.iSubItem= n; ListView_InsertColumn(g.hList, n, lvCol); // Text 12 SQL_VARCHAR Char // Byte -6 SQL_TINYINT } // 行情報 LV_ITEM lvItem; lvItem.mask= LVIF_TEXT; lvItem.iItem= 0; while (1) { rc = SQLFetch(hstmt); if (rc == SQL_NO_DATA) break; if (rc == SQL_ERROR) break; for (n = 0; n col; n++) { SQLGetData(hstmt, n+1, SQL_C_TCHAR, buf, _countof(buf), len); if (len == SQL_NULL_DATA) { buf[0] = _T( \0 ); } lvItem.pszText= buf; lvItem.iSubItem= n; if (n == 0) { ListView_InsertItem(g.hList, lvItem); } else { ListView_SetItem(g.hList, lvItem); } } lvItem.iItem++; } SQLFreeHandle(SQL_HANDLE_STMT, hstmt); Exit SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); } //------------------------------------------------------------------------------ BOOL SaveTable(HWND hWnd) { TCHAR szNew[MAX_PATH]; _stprintf_s(szNew, _T("%s%s_"), g.szDbq, g.szTable); if (CreateCsvFile(hWnd, szNew) == FALSE) { return FALSE; } // CSVファイルの削除とリネーム TCHAR szOld[MAX_PATH]; _stprintf_s(szOld, _T("%s%s"), g.szDbq, g.szTable); BOOL br; br = DeleteFile(szOld); br = MoveFile(szNew, szOld); if (br == FALSE) { MessageBox(hWnd, _T("CSVファイルのリネームに失敗しました。"), NULL, MB_OK); return FALSE; } g.bTableMod = FALSE; return TRUE; } //------------------------------------------------------------------------------ BOOL CreateCsvFile(HWND hWnd, LPCTSTR pszPath) { TCHAR szBuf[MAX_PATH]; int nColNum = 6; // ファイルのオープン FILE *pFile; errno_t er = _tfopen_s( pFile, pszPath, _T("wt")); if (er) { MessageBox(hWnd, _T("ファイルのオープンに失敗しました。"), NULL, MB_OK); return FALSE; } // ヘッダ行 _stprintf_s(szBuf, _T("%s%s"), g.szDbq, _T("schema.ini")); DWORD dw = GetPrivateProfileString(g.szTable, _T("ColNameHeader"), NULL, szBuf, _countof(szBuf), szBuf); if (_tcsicmp(szBuf, _T("true")) == 0) { LVCOLUMN lvcol; lvcol.mask= LVCF_TEXT; lvcol.pszText= szBuf; lvcol.cchTextMax= _countof(szBuf); for (int nCol = 0; ; ) { ListView_GetColumn(g.hList, nCol, lvcol); _ftprintf_s(pFile, _T("%s"), lvcol.pszText); if (nColNum = ++nCol) { break; } _ftprintf_s(pFile, _T(",")); } _ftprintf_s(pFile, _T("\n")); } // 書き込み int nRowNum = ListView_GetItemCount(g.hList); for (int nRow = 0; nRow nRowNum; nRow++) { for (int nCol = 0; ; ) { ListView_GetItemText(g.hList, nRow, nCol, szBuf, _countof(szBuf)); _ftprintf_s(pFile, _T("%s"), szBuf); if (nColNum = ++nCol) { break; } _ftprintf_s(pFile, _T(",")); } _ftprintf_s(pFile, _T("\n")); } fclose(pFile); return TRUE; } resource.h #define IDD_MAIN100 #define IDD_SUB101 #define IDC_STATIC-1 #define IDC_PREVIEW1000 #define IDC_ADDRESS1001 #define IDC_PRINT1002 #define IDC_RECORD1003 #define IDC_SPIN1004 #define IDC_UPDATE1005 #define IDC_FIELD01010 #define IDC_FIELD11011 #define IDC_FIELD21012 #define IDC_FIELD31013 #define IDC_FIELD41014 #define IDC_FIELD51015 #define IDC_LIST1100 #define IDC_CHECK1101 #define IDC_SAVE1102 PrnAddr.rc // resource script #include windows.h #include "resource.h" //------------------------------------------------------------------------------ IDD_MAIN DIALOGEX 100, 50, 400, 304 STYLE WS_POPUPWINDOW | WS_MINIMIZEBOX EXSTYLE WS_EX_APPWINDOW | WS_EX_ACCEPTFILES CAPTION "PrnAddr" FONT 10, "MS ゴシック" BEGIN LTEXT"",IDC_PREVIEW,4,4,200,296,WS_BORDER | SS_OWNERDRAW LTEXT"氏名",IDC_STATIC,212,8,32,12 EDITTEXTIDC_FIELD0,248,8,144,12,ES_AUTOHSCROLL LTEXT"連名",IDC_STATIC,212,28,32,12 EDITTEXTIDC_FIELD1,248,28,144,12,ES_AUTOHSCROLL LTEXT"郵便番号",IDC_STATIC,212,48,32,12 EDITTEXTIDC_FIELD2,248,48,144,12,ES_AUTOHSCROLL LTEXT"住所1",IDC_STATIC,212,68,32,12 EDITTEXTIDC_FIELD3,248,68,144,12,ES_AUTOHSCROLL LTEXT"住所2",IDC_STATIC,212,88,32,12 EDITTEXTIDC_FIELD4,248,88,144,12,ES_AUTOHSCROLL LTEXT"住所3",IDC_STATIC,212,108,32,12 EDITTEXTIDC_FIELD5,248,108,144,12,ES_AUTOHSCROLL EDITTEXTIDC_RECORD,248,128,48,16 CONTROL"",IDC_SPIN,"msctls_updown32", UDS_ARROWKEYS | UDS_SETBUDDYINT | UDS_ALIGNRIGHT, 280,128,32,16 PUSHBUTTON"更新( U)",IDC_UPDATE,336,128,56,24 PUSHBUTTON"住所録( A)",IDC_ADDRESS,212,276,56,24 PUSHBUTTON"単票印刷( P)",IDC_PRINT,276,276,56,24 PUSHBUTTON"終了( X)",IDCANCEL,340,276,56,24 END //------------------------------------------------------------------------------ IDD_SUB DIALOG 0, 350, 384, 200 STYLE WS_POPUPWINDOW CAPTION "住所録" FONT 9, "MS Pゴシック" BEGIN CONTROL"",IDC_LIST,"SysListView32", WS_BORDER | WS_TABSTOP | LVS_REPORT,8,8,368,160 CONTROL"全てチェック/解除( A)",IDC_CHECK,"button", BS_AUTOCHECKBOX | WS_TABSTOP,8,176,80,16 PUSHBUTTON"保存( S)",IDC_SAVE,216,176,48,16 PUSHBUTTON"連続印刷( P)",IDC_PRINT,272,176,48,16 PUSHBUTTON"閉じる( X)",IDCANCEL,328,176,48,16 END schema.ini [address.csv] ColNameHeader=True CharacterSet=932 Format=CSVDelimited Col1=氏名 Char Col2=連名 Char Col3=郵便番号 Char Width 8 Col4=住所1 Char Col5=住所2 Char Col6=住所3 Char address.csv 氏名,連名,郵便番号,住所1,住所2,住所3 国会 議事堂, 花子 ,100-0014,東京都千代田区,永田町一丁目七番一号, 東京 タワー,,105-0011,東京都港区,芝公園四丁目二―八,
https://w.atwiki.jp/sampleisbest/pages/208.html
開発環境 Microsoft Visual C# 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Windows Game (4.0) プロジェクト名 XnaBlock Game1.cs using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; namespace XnaBlock { class Game1 Game { GraphicsDeviceManager graphics; SpriteBatch sprite; SpriteFont font; Effect effect; Texture2D texture; // fps DateTime prevTime; int draw = 0; int fps = 0; const int blockMax = 20000; int blockNum = 0; VertexBuffer instanceBuffer; VertexBuffer geometryBuffer; IndexBuffer indexBuffer; VertexDeclaration instanceVertexDeclaration; VertexBufferBinding[] bindings; Matrix projection; // カメラ Vector3 camPos = new Vector3(50.5f, 1.5f, 50.5f); int camLat = 0; int camLong = 225; struct InstanceInfo { public Matrix World; public Vector2 AtlasCoordinate; } public Game1() { graphics = new GraphicsDeviceManager(this); graphics.PreferredBackBufferWidth = 1280; graphics.PreferredBackBufferHeight = 720; Content.RootDirectory = "Content"; IsMouseVisible = true; } protected override void Initialize() { sprite = new SpriteBatch(GraphicsDevice); prevTime = DateTime.Now; base.Initialize(); } protected override void LoadContent() { // ソリューション エクスプローラーの(Content)に追加しておく font = Content.Load SpriteFont ("SpriteFont1"); // 新しい項目:Sprite Font effect = Content.Load Effect ("HardwareInstancing"); // 新しい項目:Effect File (.fx) texture = Content.Load Texture2D ("Texture4"); // 既存の項目:Texture4.png GenerateGeometryBuffers(0.5f); GenerateInstanceVertexDeclaration(); GenerateInstanceInformation(); bindings = new VertexBufferBinding[2]; bindings[0] = new VertexBufferBinding(geometryBuffer, 0); bindings[1] = new VertexBufferBinding(instanceBuffer, 0, 1); projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45), GraphicsDevice.Viewport.AspectRatio, 0.1f, 2000); effect.CurrentTechnique = effect.Techniques["Instancing"]; effect.Parameters["cubeTexture"].SetValue(texture); base.LoadContent(); } void GenerateGeometryBuffers(float size) { VertexPositionTexture[] vertices = new VertexPositionTexture[24]; for (int n = 0; n 4; n++) { float u = size * ((n 1) * 2 - 1); float v = size * ((n 2) - 1); vertices[0 + n].Position = new Vector3(u, size, v); vertices[4 + n].Position = new Vector3(u, -size, -v); vertices[8 + n].Position = new Vector3(-size, -v, u); vertices[12 + n].Position = new Vector3(u, -v, size); vertices[16 + n].Position = new Vector3(size, -v, -u); vertices[20 + n].Position = new Vector3(-u, -v, -size); } for (int n = 0; n 4; n++) { int u = n 1; int v = (n 1) 1; vertices[0 + n].TextureCoordinate = new Vector2(0 + u, 0 + v); vertices[4 + n].TextureCoordinate = new Vector2(1 + u, 0 + v); vertices[8 + n].TextureCoordinate = new Vector2(2 + u, 0 + v); vertices[12 + n].TextureCoordinate = new Vector2(0 + u, 1 + v); vertices[16 + n].TextureCoordinate = new Vector2(1 + u, 1 + v); vertices[20 + n].TextureCoordinate = new Vector2(2 + u, 1 + v); } geometryBuffer = new VertexBuffer(GraphicsDevice, typeof(VertexPositionTexture), 24, BufferUsage.WriteOnly); geometryBuffer.SetData(vertices); int[] indices = new int[36]; for (int n = 0; n 6; n++) { int n6 = n * 6; int n4 = n * 4; indices[n6 + 0] = n4 + 0; indices[n6 + 1] = n4 + 1; indices[n6 + 2] = n4 + 2; indices[n6 + 3] = n4 + 1; indices[n6 + 4] = n4 + 3; indices[n6 + 5] = n4 + 2; } indexBuffer = new IndexBuffer(GraphicsDevice, typeof(int), 36, BufferUsage.WriteOnly); indexBuffer.SetData(indices); } void GenerateInstanceVertexDeclaration() { VertexElement[] elements = new VertexElement[5]; for (int n = 0; n 4; n++) { elements[n] = new VertexElement(sizeof(float) * 4 * n, VertexElementFormat.Vector4, VertexElementUsage.TextureCoordinate, n + 1); } elements[4] = new VertexElement(sizeof(float) * 16, VertexElementFormat.Vector2, VertexElementUsage.TextureCoordinate, 5); instanceVertexDeclaration = new VertexDeclaration(elements); } void GenerateInstanceInformation() { InstanceInfo[] instances = new InstanceInfo[blockMax]; // 地面 int n = 0; for (int z = 0; z 100; z++) { for (int x = 0; x 100; x++) { instances[n].World = Matrix.CreateTranslation( new Vector3(x + 0.5f, 0.5f, z + 0.5f)); instances[n].AtlasCoordinate = new Vector2(0, 0); n++; } } Random rnd = new Random(); for (; n blockMax; n++) { instances[n].World = Matrix.CreateFromYawPitchRoll( (float)rnd.NextDouble() * MathHelper.TwoPi, (float)rnd.NextDouble() * MathHelper.TwoPi, (float)rnd.NextDouble() * MathHelper.TwoPi) * Matrix.CreateTranslation( new Vector3(rnd.Next(100), rnd.Next(100), rnd.Next(100))); instances[n].AtlasCoordinate = new Vector2(0, 0); } blockNum = n; instanceBuffer = new VertexBuffer(GraphicsDevice, instanceVertexDeclaration, blockMax, BufferUsage.WriteOnly); instanceBuffer.SetData(instances); } protected override void Update(GameTime gameTime) { KeyboardState state = Keyboard.GetState(); if (state[Keys.Escape] == KeyState.Down) Exit(); if (state[Keys.Escape] == KeyState.Down) Exit(); if (state[Keys.W] == KeyState.Down) Move(0, 0); if (state[Keys.S] == KeyState.Down) Move(180, 0); if (state[Keys.A] == KeyState.Down) Move(0, -90); if (state[Keys.D] == KeyState.Down) Move(0, 90); if (state[Keys.Up] == KeyState.Down) camLat++; if (state[Keys.Down] == KeyState.Down) camLat--; if (state[Keys.Left] == KeyState.Down) camLong--; if (state[Keys.Right] == KeyState.Down) camLong++; if (state[Keys.PageUp] == KeyState.Down) Move(90, 0); if (state[Keys.PageDown] == KeyState.Down) Move(-90, 0); base.Update(gameTime); } void Move(int degLat, int degLong) { float rad = MathHelper.ToRadians(camLat + degLat); if (degLong == 0) { camPos.Y += (float)Math.Sin(rad) * 0.2f; } float r = (float)Math.Cos(rad) * 0.2f; rad = MathHelper.ToRadians(camLong + degLong); camPos.X += (float)Math.Cos(rad) * r; camPos.Z += (float)Math.Sin(rad) * r; } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); GraphicsDevice.DepthStencilState = DepthStencilState.Default; float rad = MathHelper.ToRadians(camLat); float y = (float)Math.Sin(rad) + camPos.Y; float r = (float)Math.Cos(rad); rad = MathHelper.ToRadians(camLong); float x = camPos.X + (float)Math.Cos(rad) * r; float z = camPos.Z + (float)Math.Sin(rad) * r; Matrix view = Matrix.CreateLookAt(camPos, new Vector3(x, y, z), Vector3.Up); GraphicsDevice.Indices = indexBuffer; effect.Parameters["WVP"].SetValue(view * projection); effect.CurrentTechnique.Passes[0].Apply(); GraphicsDevice.SetVertexBuffers(bindings); GraphicsDevice.DrawInstancedPrimitives(PrimitiveType.TriangleList, 0, 0, 24, 0, 12, blockNum); // フレームレート draw++; DateTime now = DateTime.Now; TimeSpan t = now - prevTime; if (t.TotalMilliseconds = 1000) { fps = draw; draw = 0; prevTime = now; } sprite.Begin(); string text = "fps=" + fps + " lat=" + camLat + " long=" + camLong + " block=" + blockNum; sprite.DrawString(font, text, new Vector2(0, 0), Color.White); text = string.Format("x={0 f1} y={1 f1} z={2 f1}", camPos.X, camPos.Y, camPos.Z); sprite.DrawString(font, text, new Vector2(0, 20), Color.White); sprite.End(); base.Draw(gameTime); } } } HardwareInstancing.fx /* Effect File プロジェクトのプロパティ [XNA Game Studio]タブ Use HiDef to access the complete API */ float4x4 WVP; texture cubeTexture; sampler TextureSampler = sampler_state { texture = cubeTexture ; mipfilter = LINEAR; minfilter = LINEAR; magfilter = LINEAR; }; struct InstancingVSinput { float4 Position POSITION0; float2 TexCoord TEXCOORD0; }; struct InstancingVSoutput { float4 Position POSITION0; float2 TexCoord TEXCOORD0; }; InstancingVSoutput InstancingVS( InstancingVSinput input, float4x4 instanceTransform TEXCOORD1, float2 atlasCoord TEXCOORD5) { InstancingVSoutput output; float4 pos = input.Position; pos = mul(pos, transpose(instanceTransform)); pos = mul(pos, WVP); output.Position = pos; output.TexCoord = float2( atlasCoord.x + (input.TexCoord.x / 4.0f), atlasCoord.y + (input.TexCoord.y / 4.0f)); return output; } float4 InstancingPS(InstancingVSoutput input) COLOR0 { return tex2D(TextureSampler, input.TexCoord); } technique Instancing { pass Pass0 { VertexShader = compile vs_3_0 InstancingVS(); PixelShader = compile ps_3_0 InstancingPS(); } }
https://w.atwiki.jp/ns2best/pages/4.html
ニュース @wikiのwikiモードでは #news(興味のある単語) と入力することで、あるキーワードに関連するニュース一覧を表示することができます 詳しくはこちらをご覧ください。 =>http //www1.atwiki.jp/guide/pages/266.html#id_542badf7 たとえば、#news(ゲーム)と入力すると以下のように表示されます。 台北ゲームショウ2023現地リポート。4日間で30万人が来場する、東京ゲームショウとはまた違う魅力と特徴のあるイベント - ファミ通.com エジプト考古学者による時代考証済み!『Pharaoh A New Era』ゲームプレイトレイラー公開―ミッション攻略はかなり高難易度 ... - Game*Spark 「札幌発ゲームの開発を」 セガ札幌スタジオ・瀬川社長講演 道政経懇:北海道新聞デジタル - 北海道新聞 「BLUE REFLECTION SUN/燦」,リリース直前生放送が2月14日に ... - 4Gamer.net ユニークな物理系パズルゲーム「IDEA」,3月8日のリリースを発表。白い電球を転がして,アイデアを開花させよう - 4Gamer.net FALL OUT BOY(フォール・アウト・ボーイ)、NHLオールスター ... - TOWER RECORDS ONLINE 村上隆の代表作“お花”のキャラを育てるデジタル育成ゲームが登場 ... - smart ニコリのパズルゲーム『橋をかけろ』がSwitch/PC/Xbox One向けに2月9日から配信開始。数字と数字を線でつなぐ、誰でも遊べて頭を使うルール - ファミ通.com NFLとDAZNが長期契約を締結、来季からゲームパス ... - NFL日本公式サイト 協力謎解きゲーム『How 2 Escape』発表。2人がそれぞれPCとスマホで ... - AUTOMATON テンセント、人気ゲーム「ヴァロラント」リーグ設立計画-統制 ... - ブルームバーグ トレーニングゲーム vs FC延岡AGATA 試合結果について - ガイナーレ鳥取 2023シーズンホームゲーム 場外ステージイベント出演者募集のお知らせ - レノファ山口FC 【3月17日、18日】サントリーサンバーズ住吉ホームゲーム ファン ... - サントリー 5つの文明が覇を争うボードゲーム「モニュメンタル」の日本語版が ... - 4Gamer.net スクエニ牧場RPG『ハーヴェステラ』最新アプデ配信。ゲーム終盤の“あの ... - AUTOMATON 自分好みにカスタマイズできるモジュール型アケコンが,海外の ... - 4Gamer.net 【アケアカ】ハムスターがゲームメーカー“アルュメ”のタイトルの権利を取得。第1弾『アケアカ まじかるスピード』が2月9日に配信決定! - ファミ通.com ハムスター,アルュメのゲームなどに関する全権利を取得。第1弾タイトル「アーケードアーカイブス まじかる ... - 4Gamer.net 宿屋の予約を勝ち取れ!ブラフと先読みのボードゲーム『オーバー ... - Dream News メタバースゲーム「The Sandbox(サンドボックス)」、サウジ政府機関とMOU締結 - CRYPTO TIMES 八戸市で避難所運営手順の図上訓練 ゲーム感覚で学ぶ|NHK 青森県 ... - nhk.or.jp スマートフォン向けリズムゲーム「D4DJ Groovy Mix」イベント&ガチャ ... - みんかぶ インディーズのロボットゲーム10作品を一堂に集めた ... - 4Gamer.net Steam乗り物づくりゲーム『Astronimo』発表。最大4人で乗り物作成 ... - AUTOMATON くにおくん風2on2バスケゲーム『Street Basket Challenge』がSteamに近日登場! - Game*Spark Gリーグ・ネクストアップゲームの出場選手決定 馬場雄大は選外 ... - Sporting News ドット絵でコマンドバトルのゾンビゲーム『ゾンビ・オブ・ザ ... - Yahoo!ニュース 新作リアル脱出ゲーム『探偵博物館 シャーロックミュージアムからの脱出』開催決定 - http //spice.eplus.jp/ TVアニメ『スパイ教室』初のプライズ商品が、全国のゲーム ... - PR TIMES クラウドゲーム×配信者「“視聴”と“遊ぶ”をシームレスに連携 ... - PR TIMES ゲームクリエイターズギルド×慶應義塾大学 社会&ビジネスゲーム ... - PR TIMES 茨城・つくばの並木中 SDGs版「人生ゲーム」で授業 17目標、学び ... - 茨城新聞クロスアイ 生徒と奏でる青春育成ゲーム『ウインドボーイズ!』過去の限定 ... - PR TIMES 【ゲーム情報】八王子戦 CLUB BIGBULLS抽選会の賞品は・・・? - bigbulls.jp 『TOKYO INDIE GAMES SUMMIT』 本日よりチケット販売開始 ... - PR TIMES YouTube ライブで遊べる参加型ゲームプラットフォーム fingger ... - PR TIMES [プレイレポ]「Axie Infinity Origins」のゲームシステムや賞金額を紹介。東南アジアで人気を集めるブロック ... - 4Gamer.net ここはどこ……? 場所当てゲーム「GeoGuessr」がVTuberの間で流行 - Mogura VR Sensor Tower、優れたモバイルゲーム/アプリを表彰する「APAC Awards ... - SocialGameInfo 『fingger』リリースゲームやTGS2022出展、『VALORANT』大会 ... - 電撃オンライン 【特集】 4KやレイトレゲームもサクサクなRTX 4090搭載 ... - PC Watch 【リポート】ネッツのデュラントがオールスターゲームを欠場へ ... - Sporting News インディーズゲームの小部屋:Room#770「Vengeful Guardian ... - 4Gamer.net ゲームチェンジの好機 - 愛媛新聞 大ヒットゲームから新たなCG長編誕生!監獄島が恐怖に染まる ... - Yahoo!ニュース 中国モバイルゲームトップ30の海外売上高、総額約1兆2200億円 米・日 ... - 36Kr Japan ボールの代わりに人間をぶん投げるバカスポーツゲーム『Grab n Throw ... - Game*Spark カードゲームで災害対応学ぶ 伊勢・明倫小、意見出し合う 三重 ... - Yahoo!ニュース 【調査レポート】スマホに入っているゲームアプリの数は?「2つ ... - PR TIMES 「胸を盛らず“素の状態”で勝負しました」ゲームヒロインに扮する ... - Yahoo!ニュース 動画配信、ゲーム市場に熱視線 - 日本経済新聞 『STAR WARS ジェダイ:サバイバー』から9分間のゲームプレイ映像を公開!新たな惑星で始まるカルの冒険 - IGN Japan ボードゲームも「独占」から「分かち合い」へ! シェア経済を体験 ... - greenz.jp 「ゲーム好きのための婚活パーティー in TZ GAME Labs」3月4日に ... - 4Gamer.net 「爆雪の日にできるカスゲーム紹介」じゃんけんに負けたメイド姿 ... - Yahoo!ニュース 単語パズル「Wordle」を解きつつアクションゲーム「Flappy Bird ... - GIGAZINE(ギガジン) 大阪南港ATCで人気ゲーム「ペルソナ」展 原画や「イザナギ」等身 ... - Yahoo!ニュース 小学3年生のプログラマー 妹のために作ったゲームで全国大会へ ... - Yahoo!ニュース 「コナステ メダルコーナー」,ビデオシングルゲーム“フィーチャー ... - 4Gamer.net 「命は清き焔」―ゲーム音楽ライブ復活の象徴的イベント ... - Yahoo!ニュース 『ポケモンSV』が任天堂ゲーム専用機ソフトとして過去最高の初動販売数を記録。Switch(有機EL)が販売台数を伸ばす【任天堂決算】 - ファミ通.com 飛行船で旅するキュートな貿易ゲーム『Townseek』デモ版がSteam ... - Yahoo!ニュース テレビ大阪「音楽爆弾」,2月8日放送回はゲーム音楽の裏側を徹底 ... - 4Gamer.net 『更年期が幸年期になるカードゲーム』をつかう研修で「更年期 ... - PR TIMES 「レトロゲーム」の価格高騰、若者・外国人から人気で数万円以上に…投資目的の買い占めも - 読売新聞オンライン 「ドラえもん人生ゲーム ひみつ道具で大冒険!」発売決定! 3つの ... - Yahoo!ニュース 2023/3/4・5 埼玉県上尾大会 ホームゲーム情報|埼玉上尾 ... - 上尾中央医科グループ NCSOFT新作カジュアルマッチ3パズルゲーム『パズアップ ... - ファミ通App 『Atomic Heart』台北ゲームショウで球状のボスとの戦闘シーンなど ... - Yahoo!ニュース 「格ゲー×ローグライク」という唯一無二のゲーム、『TOBAL2』の ... - Yahoo!ニュース 確定申告をゲーム実況で解説する動画が大反響!国税庁が語った ... - Yahoo!ニュース 「やはりゲームでも俺の青春ラブコメはまちがっている。完 ... - Yahoo!ニュース 『ホグワーツ・レガシー』15時間プレイレビュー。緻密に再現された『ハリー・ポッター』の世界に感動、俺TUEEEな魔法アクションも爽快 - ファミ通.com VTuber効果?「イカゲーム」風デスゲーム『Crab Game』の ... - Yahoo!ニュース マルチな才能を持つ赤松健氏のパソコンゲームデビュー作 ... - Yahoo!ニュース マルチな才能を持つ赤松健氏のパソコンゲームデビュー作『パラディン』 - AKIBA PC Hotline! 川崎フロンターレ:2/17 横浜FM「ホームゲーム開催情報」について - 川崎フロンターレ 『鉄拳8』に「ニーナ・ウィリアムズ」が参戦決定!ゲームプレイ ... - Yahoo!ニュース 「死の宣告」と投稿…ゲームセンターが電気料金値上げで悲鳴 年間 ... - Yahoo!ニュース 『ホグワーツ・レガシー』情報まとめ。『ハリー・ポッター』のオープンワールドアクションRPG。デラックス・エディションは明日(2/7)からプレイ可能 - ファミ通.com 『シン・クロニクル』総合ディレクター松永純氏と『ギ・クロニクル』朗読に参加した声優・相良茉優さんが登場! ゲームのニュース番組『ゲームのお天気お姉さん』2月7日(火)夜8時から配信開始 - 電ファミニコゲーマー 無料プレイゲームの『Warlander』が急浮上!『ホグワーツ ... - Yahoo!ニュース 「セガを殺せ」謎のスマホゲームプロジェクト始動 ティザー映像は ... - Yahoo!ニュース 「ホグワーツ・レガシー」が発売前日にトレンド入り! ハリポタ世界への没入体験に期待高まる 「違法アバダケダブラ ... - GAME Watch ローポリながらよく動く総合格闘技ゲーム『Weekend Warriors ... - Yahoo!ニュース 話題の会話型推理ゲーム「マダミス」 最大の魅力は「一度きり」の ... - Yahoo!ニュース 世界最長級ボードゲーム「メガシヴィ」、15時間の熱戦! 沖縄で初 ... - Yahoo!ニュース PS5、ついに販売“正常化” ソニーのゲーム事業に死角はないのか - Impress Watch テレビゲームの象徴的な存在「セーブポイント」は、なぜわれわれ ... - Yahoo!ニュース 国立天文台がゲームを開発!? 遊んで学べるファンタジーTRPG ... - Yahoo!ニュース 時間を溶かしたければ必見!ゲームしながら社会勉強もできる「PS ... - Yahoo!ニュース 今年で40周年!激ムズLDゲーム『ドラゴンズレア』で即死祭り開催 ... - Yahoo!ニュース 【2月5日更新】今週発売! 期待の新作ゲーム情報まとめ(Impress ... - Yahoo!ニュース サバイバルホラーゲーム「ラブラブスクールデイズ」,2月6日に ... - 4Gamer.net オープンワールドゾンビサバイバルMMO『The Day Before』10分 ... - Yahoo!ニュース <小野憲史のゲーム時評>ゲーム、ネット、スマホで発達障害“的”な ... - Yahoo!ニュース Xboxゲームパスは「持続不能」、任天堂のビジネスモデルがベスト ... - Yahoo!ニュース auゲーム版「FGO」がサービス終了。スケジュールは後日案内 ... - Yahoo!ニュース “著作権者不明”なゲームに朗報?新制度で加速していく復刻 ... - Yahoo!ニュース PCゲームは“タダ”で手に入れる! 人気タイトルから名作まで、無料 ... - WIRED.jp 【ゲーム依存】なる子とならない子の決定的な差 - 東洋経済オンライン
https://w.atwiki.jp/sampleisbest/pages/239.html
開発環境 Microsoft Visual C# 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Windows Game (4.0) プロジェクト名 XnaCarRace compass.png map.png CustomVertex.cs using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; namespace CustomVertex { struct VertexPosition IVertexType { public Vector3 Position; public VertexPosition(Vector3 position) { Position = position; } static readonly VertexDeclaration VertexDeclaration = new VertexDeclaration( new VertexElement(0, VertexElementFormat.Vector3, VertexElementUsage.Position, 0)); VertexDeclaration IVertexType.VertexDeclaration { get { return VertexDeclaration; } } } } Game1.cs /* * プロジェクトのプロパティ * [XNA Game Studio]タブ * Use HiDef to access the complete API */ using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using CustomVertex; namespace XnaCarRace { class Game1 Game { GraphicsDeviceManager graphics; SpriteBatch sprite; SpriteFont font; Effect effect; EffectParameter ViewProj; Texture2D map; Texture2D compass; Texture2D marker; // fps int fpsSec; int fpsDraw = 0; int fpsCount = 0; VertexBuffer instanceBuffer; VertexBuffer geometryBuffer; IndexBuffer indexBuffer; VertexDeclaration instanceVertexDeclaration; VertexBufferBinding[] bindings; Matrix projection; byte[,] objMap; // カメラ //Vector3 camPos = new Vector3(0, 2, 0); Vector3 camPos = new Vector3(22, 0.5f, 70); float camLon = 270; float velocity = 0; float steering = 0; struct InstanceInfo { public Matrix World; public Vector4 Color; } public Game1() { graphics = new GraphicsDeviceManager(this); graphics.PreferredBackBufferWidth = 1280; graphics.PreferredBackBufferHeight = 720; Content.RootDirectory = "Content"; IsMouseVisible = true; } protected override void LoadContent() { sprite = new SpriteBatch(GraphicsDevice); font = Content.Load SpriteFont ("SpriteFont1"); effect = Content.Load Effect ("Effect1"); ViewProj = effect.Parameters["ViewProj"]; //effect.CurrentTechnique = effect.Techniques["Technique1"]; map = Content.Load Texture2D ("map"); // 128x128くらいのpng compass = Content.Load Texture2D ("compass"); GenerateGeometryBuffers(); GenerateInstanceVertexDeclaration(); GenerateInstanceInformation(); bindings = new VertexBufferBinding[2]; bindings[0] = new VertexBufferBinding(geometryBuffer, 0); bindings[1] = new VertexBufferBinding(instanceBuffer, 0, 1); projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45), GraphicsDevice.Viewport.AspectRatio, 0.1f, 100); // マーカー Color[] data = new Color[9]; for (int n = 0; n 9; n++) { data[n] = new Color(255, 255, 255); } marker = new Texture2D(GraphicsDevice, 3, 3); marker.SetData Color (data); base.LoadContent(); } void GenerateGeometryBuffers() { // 頂点 VertexPosition[] vertices = new VertexPosition[8]; Vector3[] cube = { new Vector3(1, 1, 1), new Vector3(1, 1, -1), new Vector3(1, -1, 1), new Vector3(1, -1, -1), new Vector3(-1, -1, -1), new Vector3(-1, 1, -1), new Vector3(-1, -1, 1), new Vector3(-1, 1, 1), }; for (int n = 0; n 8; n++) { vertices[n] = new VertexPosition(cube[n] * 0.5f); } geometryBuffer = new VertexBuffer(GraphicsDevice, typeof(VertexPosition), 8, BufferUsage.WriteOnly); geometryBuffer.SetData(vertices); // 索引 short[] indices = { 0, 1, 2, 3, 2, 1, // +X面 4, 5, 6, 7, 6, 5, // -X面 0, 7, 1, 5, 1, 7, // +Y面 4, 6, 3, 2, 3, 6, // -Y面 0, 2, 7, 6, 7, 2, // +Z面 4, 3, 5, 1, 5, 3, // -Z面 }; indexBuffer = new IndexBuffer(GraphicsDevice, typeof(short), 36, BufferUsage.WriteOnly); indexBuffer.SetData(indices); } void GenerateInstanceVertexDeclaration() { VertexElement[] elements = new VertexElement[5]; for (int n = 0; n 4; n++) { elements[n] = new VertexElement(sizeof(float) * 4 * n, VertexElementFormat.Vector4, VertexElementUsage.TextureCoordinate, n + 1); } elements[4] = new VertexElement(sizeof(float) * 16, VertexElementFormat.Vector4, VertexElementUsage.TextureCoordinate, 5); instanceVertexDeclaration = new VertexDeclaration(elements); } void GenerateInstanceInformation() { objMap = new byte[map.Width, map.Height]; int dataNum = map.Width * map.Height; InstanceInfo[] instances = new InstanceInfo[dataNum]; Color[] data = new Color[dataNum]; map.GetData Color (0, null, data, 0, dataNum); int i = 0; for (int x = 0; x map.Height; x++) { for (int z = 0; z map.Width; z++) { Color color = data[map.Width * (map.Height - 1 - x) + z]; if (color == Color.Black) continue; instances[i].World = Matrix.CreateTranslation( new Vector3(0.5f + x, 0.5f, 0.5f + z)); instances[i].Color = color.ToVector4(); i++; objMap[z, x] = 1; } } instanceBuffer = new VertexBuffer(GraphicsDevice, instanceVertexDeclaration, i, BufferUsage.WriteOnly); instanceBuffer.SetData(instances, 0, i); } protected override void Update(GameTime gameTime) { float deltaVelocity = -0.001f; float deltaSteering = 0; KeyboardState kState = Keyboard.GetState(); if (kState.IsKeyDown(Keys.Escape)) Exit(); if (kState.IsKeyDown(Keys.Z)) deltaVelocity = -0.01f; if (kState.IsKeyDown(Keys.X)) deltaVelocity = 0.005f; if (kState.IsKeyDown(Keys.Left)) deltaSteering = -0.1f; if (kState.IsKeyDown(Keys.Right)) deltaSteering = 0.1f; // 速度 velocity = MathHelper.Clamp(velocity + deltaVelocity, 0, 0.2f); // ステアリング if (deltaSteering == 0) { steering = (Math.Abs(steering) 0.05f) ? 0 steering - Math.Sign(steering) * 0.05f; } else { steering += deltaSteering; } steering = MathHelper.Clamp(steering, -1, 1); if (velocity == 0) { // 停止中 camLon += Math.Sign(deltaSteering) * 2; } else { // 移動 camLon += steering; float rad = MathHelper.ToRadians(camLon); float x = (float)Math.Cos(rad) * velocity; float z = (float)Math.Sin(rad) * velocity; // 衝突判定 if (objMap[(int)(camPos.Z + z), (int)(camPos.X + x)] == 0) { camPos.X += x; camPos.Z += z; } else { velocity = 0; } } base.Update(gameTime); } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); //GraphicsDevice.BlendState = BlendState.Opaque; GraphicsDevice.DepthStencilState = DepthStencilState.Default; float rad = MathHelper.ToRadians(camLon); float x = camPos.X + (float)Math.Cos(rad); float z = camPos.Z + (float)Math.Sin(rad); Matrix view = Matrix.CreateLookAt(camPos, new Vector3(x, 0.5f, z), Vector3.Up); GraphicsDevice.Indices = indexBuffer; ViewProj.SetValue(view * projection); effect.CurrentTechnique.Passes[0].Apply(); GraphicsDevice.SetVertexBuffers(bindings); GraphicsDevice.DrawInstancedPrimitives( PrimitiveType.TriangleList, 0, 0, 8, 0, 12, instanceBuffer.VertexCount); // fps fpsDraw++; if (gameTime.TotalGameTime.Seconds != fpsSec) { fpsCount = fpsDraw; fpsDraw = 0; fpsSec = gameTime.TotalGameTime.Seconds; } sprite.Begin(); string text = string.Format("fps={0} lon={1} x={2 f1} z={3 f1}", fpsCount, camLon, camPos.X, camPos.Z); sprite.DrawString(font, text, new Vector2(0, 0), Color.White); text = string.Format("v={0 f2} s={1 f2}", velocity, steering); sprite.DrawString(font, text, new Vector2(0, 20), Color.White); sprite.Draw(map, new Vector2(20, 60), Color.White); sprite.Draw(marker, new Vector2(20 + camPos.Z, 60 + 128 - camPos.X), null, Color.White, 0, new Vector2(1, 1), 1, SpriteEffects.None, 0); sprite.Draw(compass, new Vector2(20 + 64, 200 + 64), null, Color.White, MathHelper.ToRadians(camLon), new Vector2(64, 64), 1, SpriteEffects.None, 0); sprite.End(); base.Draw(gameTime); } } } Effect1.fx float4x4 ViewProj; struct VertexShaderInput { float4 Position POSITION0; }; struct VertexShaderOutput { float4 Position POSITION0; float4 Color COLOR0; }; VertexShaderOutput VertexShaderFunction( VertexShaderInput input, float4x4 instanceTransform TEXCOORD1, float4 color TEXCOORD5) { VertexShaderOutput output; float4 pos = mul(input.Position, transpose(instanceTransform)); output.Position = mul(pos, ViewProj); output.Color = color; return output; } float4 PixelShaderFunction(VertexShaderOutput input) COLOR0 { return input.Color; } technique Technique1 { pass Pass1 { // 3.0の方が負荷が少ない VertexShader = compile vs_3_0 VertexShaderFunction(); PixelShader = compile ps_3_0 PixelShaderFunction(); } }
https://w.atwiki.jp/sampleisbest/pages/102.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Win32 プロジェクト プロジェクト名 filecopy アプリケーションの種類 Windows アプリケーション 追加のオプション 空のプロジェクト 文字セット Unicode 参考 複数ファイルのコピー (SHFileOperation) filecopy.c #include Windows.h #include "resource.h" // 関数プロトタイプ宣言 INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); void OnInitDialog(HWND hDlg); void OnButtonCopy(HWND hDlg); //============================================================================== int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN_DIALOG), NULL, DialogProc); return 0; } //------------------------------------------------------------------------------ INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { INT_PTR iRetVal = TRUE;// メッセージを処理した switch (uMsg) { case WM_COMMAND switch (LOWORD(wParam)) { case IDC_BUTTON_COPY OnButtonCopy(hDlg); break; case IDC_BUTTON_HELLO MessageBox(hDlg, TEXT("world"), TEXT("hello"), MB_OK); break; } break; case WM_INITDIALOG OnInitDialog(hDlg); iRetVal = TRUE;// SetFocusでフォーカスを設定した場合はFALSE break; case WM_CLOSE EndDialog(hDlg, IDOK); break; default iRetVal = FALSE;// メッセージを処理しなかった } return iRetVal; } //------------------------------------------------------------------------------ void OnInitDialog(HWND hDlg) { RECT rcDesktop; RECT rcDialog; GetWindowRect(GetDesktopWindow(), rcDesktop); GetWindowRect(hDlg, rcDialog); SetWindowPos(hDlg, HWND_TOP, (rcDesktop.right - (rcDialog.right - rcDialog.left)) / 2, (rcDesktop.bottom - (rcDialog.bottom - rcDialog.top)) / 2, 0, 0, SWP_NOSIZE); } //------------------------------------------------------------------------------ void OnButtonCopy(HWND hDlg) { SHFILEOPSTRUCT fop; int i; fop.hwnd= hDlg; fop.wFunc= FO_COPY; fop.pFrom= TEXT("C \\tmp\\hoge.mp4\0"); fop.pTo= TEXT("Z \\\0"); fop.fFlags= FOF_ALLOWUNDO; i = SHFileOperation( fop); } resource.h #define IDD_MAIN_DIALOG100 #define IDC_BUTTON_COPY1000 #define IDC_BUTTON_HELLO1001 filecopy.rc // リソース スクリプト #include windows.h #include "resource.h" IDD_MAIN_DIALOG DIALOGEX 0, 0, 320, 240 STYLE WS_POPUPWINDOW | WS_MINIMIZEBOX EXSTYLE WS_EX_APPWINDOW CAPTION "filecopy" FONT 9, "MS Pゴシック" BEGIN PUSHBUTTON"copy",IDC_BUTTON_COPY,12,12,48,16 PUSHBUTTON"hello",IDC_BUTTON_HELLO,12,40,48,16 END
https://w.atwiki.jp/sampleisbest/pages/194.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Win32 プロジェクト プロジェクト名 ImgView2 アプリケーションの種類 Windows アプリケーション 追加のオプション 空のプロジェクト 文字セット Unicode 画像表示(エクスプローラの並び順) ImgView2.cpp // Unicode #include Windows.h #include CommCtrl.h #include shimgdata.h #include stdio.h #include string #include vector #include "resource.h" using namespace std; #define WIDTH(rect) ((rect).right - (rect).left) #define HEIGHT(rect) ((rect).bottom - (rect).top) #define SAFE_RELEASE(p) { if(p) { (p)- Release(); (p)=NULL; } } #define APP_NAME TEXT("ImgView2") typedef vector wstring VecStr; // 関数プロトタイプ宣言 void CreateFileList(LPCTSTR pszPath); BOOL GetFileList(HWND hExplorer, LPCTSTR pszFileName); BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam); BOOL IsImgFile(LPCTSTR pszPath); LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); BOOL OnCommand(HWND hWnd, WPARAM wParam); void OnDelete(HWND hWnd); void OnDropFiles(HWND hWnd, WPARAM wParam); void OnSizeNormal(HWND hWnd); void OnSizeAdjust(HWND hWnd); void OnExecute(void); void OnPaint(HWND hWnd); void GetImage(HWND hWnd); BOOL MyGetFileTime(LPSYSTEMTIME pSystemTime, LPCTSTR pszFileName); // 外部変数構造体 static struct { TCHAR szBaseDir[MAX_PATH];// 基準ディレクトリ VecStr vsFileName;// ファイル名配列 VecStr size_type idxCurr;// 現在の位置 IShellImageDataFactory *pImgDatFac;// 画像データファクトリ IShellImageData *pImgDat;// 画像データ SIZE sizeImg;// 画像サイズ SIZE sizeDst;// 出力サイズ HWND hListView;// エクスプローラのリストビュー } g; //============================================================================== int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) { // プログラム引数 LPTSTR pszCmdLine = GetCommandLine(); int argc; LPTSTR *argv = CommandLineToArgvW(pszCmdLine, argc); if (2 = argc) { CreateFileList(argv[1]); } // ウィンドウクラスの登録 WNDCLASSEX wcx; ZeroMemory( wcx, sizeof wcx); wcx.cbSize= sizeof wcx; wcx.style= CS_HREDRAW | CS_VREDRAW; wcx.lpfnWndProc= WndProc; wcx.hInstance= hInstance; wcx.hCursor= LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); wcx.hbrBackground= (HBRUSH)(COLOR_WINDOW + 1); wcx.lpszClassName= APP_NAME; if (RegisterClassEx( wcx) == 0) { return 0; } // ウィンドウの作成 HWND hWnd = CreateWindowEx( WS_EX_ACCEPTFILES, APP_NAME, APP_NAME, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (hWnd == NULL) { return 0; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); // メッセージループ MSG msg; HACCEL hAccTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_MAIN)); while (GetMessage( msg, NULL, 0, 0)) { if (TranslateAccelerator(msg.hwnd, hAccTable, msg) == 0) { TranslateMessage( msg); DispatchMessage( msg); } } return msg.wParam; } //------------------------------------------------------------------------------ void CreateFileList(LPCTSTR pszPath) { TCHAR szDrive[_MAX_DRIVE]; TCHAR szDir[_MAX_DIR]; TCHAR szFName[_MAX_FNAME]; TCHAR szExt[_MAX_EXT]; TCHAR szFileName[_MAX_PATH]; g.vsFileName.clear(); g.idxCurr = -1; errno_t er = _wsplitpath_s(pszPath, szDrive, szDir, szFName, szExt); swprintf_s(g.szBaseDir, L"%s%s", szDrive, szDir); swprintf_s(szFileName, L"%s%s", szFName, szExt); HWND hExplorer = NULL; while (hExplorer = FindWindowEx(NULL, hExplorer, L"ExploreWClass", NULL)) { GetFileList(hExplorer, szFileName); if (0 = g.idxCurr) { break; } } if (g.idxCurr == -1) { g.vsFileName.clear(); g.vsFileName.push_back(pszPath); g.idxCurr = 0; } } //------------------------------------------------------------------------------ BOOL GetFileList(HWND hExplorer, LPCTSTR pszFileName) { // リストビュー g.hListView = NULL; BOOL br = EnumChildWindows(hExplorer, EnumWindowsProc, 0); if (g.hListView == NULL) return FALSE; // 対象となるリストビューのプロセスハンドルを得る DWORD dwProcId = 0; GetWindowThreadProcessId(g.hListView, dwProcId); HANDLE hProc = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, dwProcId); if (hProc == NULL) return FALSE; // 他プロセス空間にメモリを確保 LPTSTR pbuf = (LPTSTR)VirtualAllocEx(hProc, NULL, MAX_PATH, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); LPLVITEM plvi = (LPLVITEM)VirtualAllocEx(hProc, NULL, sizeof (LVITEM), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); // 行数 int nRowNum = ListView_GetItemCount(g.hListView); VecStr size_type idx = 0; // ListView_GetItemText LVITEM lvi; ZeroMemory( lvi, sizeof (LVITEM)); lvi.iSubItem= 0; lvi.mask= LVIF_TEXT; lvi.pszText= pbuf; lvi.cchTextMax= MAX_PATH; for (int nRow = 0; nRow nRowNum; nRow++) { lvi.iItem = nRow; WriteProcessMemory(hProc, plvi, lvi, sizeof (LVITEM), NULL); BOOL br = SendMessage(g.hListView, LVM_GETITEM, 0, (LPARAM)plvi); if (br) { TCHAR szText[MAX_PATH]; ReadProcessMemory(hProc, pbuf, szText, MAX_PATH, NULL); if (IsImgFile(szText)) { g.vsFileName.push_back(szText); if (wcscmp(szText, pszFileName) == 0) { g.idxCurr = idx; } idx++; } } } VirtualFreeEx(hProc, plvi, 0, MEM_RELEASE); VirtualFreeEx(hProc, pbuf, 0, MEM_RELEASE); CloseHandle(hProc); return TRUE; } //------------------------------------------------------------------------------ BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) { TCHAR szBuf[256]; int nr = GetClassName(hWnd, szBuf, _countof(szBuf)); if (wcscmp(szBuf, WC_LISTVIEW) == 0) {// L"SysListView32" g.hListView = hWnd; return FALSE;// 打ち切り } BOOL br = EnumChildWindows(hWnd, EnumWindowsProc, lParam); return TRUE;// 続行 } //------------------------------------------------------------------------------ BOOL IsImgFile(LPCTSTR pszPath) { static LPCTSTR ext[] = {L".jpg", L".jpeg", L".gif", L".png"}; TCHAR szExt[_MAX_EXT]; _wsplitpath_s(pszPath, NULL, 0, NULL, 0, NULL, 0, szExt, _MAX_EXT); for (int n = 0; n _countof(ext); n++) { if (_wcsicmp(ext[n], szExt) == 0) { return TRUE; } } return FALSE; } //============================================================================== LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_PAINT OnPaint(hWnd); return 0; case WM_COMMAND if (OnCommand(hWnd, wParam)) { return 0; } break; case WM_DROPFILES OnDropFiles(hWnd, wParam); DragFinish((HDROP)wParam); return 0; case WM_CREATE CoInitialize(NULL); CoCreateInstance(CLSID_ShellImageDataFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS( g.pImgDatFac)); GetImage(hWnd); return 0; case WM_DESTROY SAFE_RELEASE(g.pImgDat); SAFE_RELEASE(g.pImgDatFac); CoUninitialize(); PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } //------------------------------------------------------------------------------ BOOL OnCommand(HWND hWnd, WPARAM wParam) { switch (LOWORD(wParam)) { case ID_RIGHT case ID_DOWN g.idxCurr++; if (g.vsFileName.size() = g.idxCurr) { g.idxCurr = 0; } break; case ID_LEFT case ID_UP if (g.idxCurr = 0) { g.idxCurr = g.vsFileName.size(); } g.idxCurr--; break; case ID_ENTER ShowWindow(hWnd, IsZoomed(hWnd) ? SW_SHOWNOACTIVATE SW_MAXIMIZE); break; case ID_SIZE_NORMAL OnSizeNormal(hWnd); // あえてスルー case ID_SIZE_ADJUST OnSizeAdjust(hWnd); break; case ID_EXECUTE OnExecute(); break; case ID_DELETE OnDelete(hWnd); break; case ID_ESCAPE DestroyWindow(hWnd); return TRUE; default return FALSE; } GetImage(hWnd); InvalidateRect(hWnd, NULL, FALSE);// ちらつき防止のため背景消去しない return TRUE; } //------------------------------------------------------------------------------ void OnDelete(HWND hWnd) { if (g.vsFileName.empty()) return; TCHAR szPath[MAX_PATH];// \0 2つで終わる要あり swprintf_s(szPath, L"%s%s%c", g.szBaseDir, g.vsFileName[g.idxCurr].c_str(), L \0 ); SHFILEOPSTRUCT fo; ZeroMemory( fo, sizeof fo); fo.hwnd= hWnd; fo.wFunc= FO_DELETE; fo.pFrom= szPath; fo.fFlags= FOF_ALLOWUNDO; SHFileOperation( fo); } //------------------------------------------------------------------------------ void OnDropFiles(HWND hWnd, WPARAM wParam) { HDROPhDrop; TCHARszPath[MAX_PATH]; hDrop = (HDROP)wParam; DragQueryFile(hDrop, 0, szPath, _countof(szPath)); CreateFileList(szPath); GetImage(hWnd); InvalidateRect(hWnd, NULL, FALSE);// ちらつき防止のため背景消去しない } //------------------------------------------------------------------------------ void OnSizeNormal(HWND hWnd) { if (g.pImgDat == NULL) return; g.sizeDst = g.sizeImg; RECT rcWorkArea;// タスクバーを除くデスクトップ領域 RECT rcWnd;// ウィンドウ領域 RECT rcClt;// クライアント領域 SIZE size;// ウィンドウ領域とクライアント領域の差分 SystemParametersInfo(SPI_GETWORKAREA, 0, rcWorkArea, 0); GetWindowRect(hWnd, rcWnd); GetClientRect(hWnd, rcClt); size.cx = WIDTH(rcWnd) - WIDTH(rcClt); size.cy = HEIGHT(rcWnd) - HEIGHT(rcClt); // デスクトップ領域からはみ出す場合、ウィンドウを左上方向に移動する if (rcWorkArea.right rcWnd.left + g.sizeDst.cx + size.cx) { rcWnd.left = 0; } if (rcWorkArea.bottom rcWnd.top + g.sizeDst.cy + size.cy) { rcWnd.top = 0; } // 最大クライアント領域に収める if (rcWorkArea.right - size.cx g.sizeDst.cx) { g.sizeDst.cx = rcWorkArea.right - size.cx; } if (rcWorkArea.bottom - size.cy g.sizeDst.cy) { g.sizeDst.cy = rcWorkArea.bottom - size.cy; } // アスペクト比の調整 if (g.sizeImg.cx g.sizeImg.cy * g.sizeDst.cx / g.sizeDst.cy) { g.sizeDst.cx = g.sizeDst.cy * g.sizeImg.cx / g.sizeImg.cy; } else { g.sizeDst.cy = g.sizeDst.cx * g.sizeImg.cy / g.sizeImg.cx; } // ウィンドウ位置のセット rcWnd.right = g.sizeDst.cx + size.cx; rcWnd.bottom = g.sizeDst.cy + size.cy; SetWindowPos(hWnd, NULL, rcWnd.left, rcWnd.top, rcWnd.right, rcWnd.bottom, SWP_NOZORDER); } //------------------------------------------------------------------------------ void OnSizeAdjust(HWND hWnd) { if (g.pImgDat == NULL) return; RECT rc; SetRect( rc, 0, 0, g.sizeDst.cx, g.sizeDst.cy); AdjustWindowRectEx( rc, WS_OVERLAPPEDWINDOW, FALSE, 0); SetWindowPos(hWnd, NULL, 0, 0, WIDTH(rc), HEIGHT(rc), SWP_NOZORDER | SWP_NOMOVE); } //------------------------------------------------------------------------------ void OnExecute(void) { if (g.vsFileName.empty()) return; TCHAR szFile[MAX_PATH]; TCHAR szParams[MAX_PATH]; GetModuleFileName(NULL, szFile, MAX_PATH); swprintf_s(szParams, L"\"%s%s\"", g.szBaseDir, g.vsFileName[g.idxCurr].c_str()); SHELLEXECUTEINFO ei; ZeroMemory( ei, sizeof ei); ei.cbSize= sizeof ei; ei.nShow= SW_SHOWNORMAL; ei.fMask= SEE_MASK_NOCLOSEPROCESS; ei.lpFile= szFile; ei.lpParameters= szParams; ShellExecuteEx( ei); } //------------------------------------------------------------------------------ void OnPaint(HWND hWnd) { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, ps); if (g.pImgDat == NULL) goto Exit; RECT rcClt; GetClientRect(hWnd, rcClt); // 画像とクライアント領域のアスペクト比を比較し // アスペクト比を維持したままクライアント領域に収める if (g.sizeImg.cx g.sizeImg.cy * rcClt.right / rcClt.bottom) { g.sizeDst.cx = rcClt.bottom * g.sizeImg.cx / g.sizeImg.cy; g.sizeDst.cy = rcClt.bottom; } else { g.sizeDst.cx = rcClt.right; g.sizeDst.cy = rcClt.right * g.sizeImg.cy / g.sizeImg.cx; } RECT rcDst; rcDst.left= (rcClt.right - g.sizeDst.cx) / 2; rcDst.top= (rcClt.bottom - g.sizeDst.cy) / 2; rcDst.right= rcDst.left + g.sizeDst.cx; rcDst.bottom= rcDst.top + g.sizeDst.cy; // 画像描画 RECT rcTmp; SetRect( rcTmp, 0, 0, g.sizeImg.cx, g.sizeImg.cy); g.pImgDat- Draw(hdc, rcDst, rcTmp); // 余白塗り潰し HBRUSH hbr = (HBRUSH)(COLOR_WINDOW + 1); if (rcClt.left rcDst.left) { CopyRect( rcTmp, rcClt); rcTmp.right = rcDst.left; FillRect(hdc, rcTmp, hbr); } if (rcClt.top rcDst.top) { CopyRect( rcTmp, rcClt); rcTmp.bottom = rcDst.top; FillRect(hdc, rcTmp, hbr); } if (rcDst.right rcClt.right) { CopyRect( rcTmp, rcClt); rcTmp.left = rcDst.right; FillRect(hdc, rcTmp, hbr); } if (rcDst.bottom rcClt.bottom) { CopyRect( rcTmp, rcClt); rcTmp.top = rcDst.bottom; FillRect(hdc, rcTmp, hbr); } Exit EndPaint(hWnd, ps); } //------------------------------------------------------------------------------ void GetImage(HWND hWnd) { SAFE_RELEASE(g.pImgDat); if (g.vsFileName.empty()) { SetWindowText(hWnd, APP_NAME); return; } // 画像ファイルの読み込み TCHAR szBuf[512]; LPCTSTR pszFileName = g.vsFileName[g.idxCurr].c_str(); swprintf_s(szBuf, L"%s%s", g.szBaseDir, pszFileName); HRESULT hr = g.pImgDatFac- CreateImageFromFile(szBuf, g.pImgDat); if (SUCCEEDED(hr)) { hr = g.pImgDat- Decode(SHIMGDEC_DEFAULT, 0, 0); } if (SUCCEEDED(hr)) { hr = g.pImgDat- GetSize( g.sizeImg); } if (FAILED(hr) || g.sizeImg.cx = 0 || g.sizeImg.cy = 0) { SAFE_RELEASE(g.pImgDat); g.sizeImg.cx = g.sizeImg.cy = 0; } // ファイル更新日時の取得 SYSTEMTIME st; MyGetFileTime( st, szBuf); // タイトルバー swprintf_s(szBuf, L"%s [%d/%d] %d/%02d/%02d %02d %02d %02d (%dx%d) - %s", pszFileName, g.idxCurr + 1, g.vsFileName.size(), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, g.sizeImg.cx, g.sizeImg.cy, APP_NAME); SetWindowText(hWnd, szBuf); } //------------------------------------------------------------------------------ BOOL MyGetFileTime(LPSYSTEMTIME pSystemTime, LPCTSTR pszFileName) { HANDLE hFile = CreateFile(pszFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { return FALSE; } FILETIME ftCreation; FILETIME ftLocal; GetFileTime(hFile, ftCreation, NULL, NULL); FileTimeToLocalFileTime( ftCreation, ftLocal); FileTimeToSystemTime( ftLocal, pSystemTime); CloseHandle(hFile); return TRUE; } resource.h #define ID_SIZE_ADJUST100 #define ID_SIZE_NORMAL101 #define ID_EXECUTE102 #define IDR_MAIN128 #define ID_ENTER129 #define ID_ESCAPE130 #define ID_LEFT131 #define ID_UP132 #define ID_RIGHT133 #define ID_DOWN134 #define ID_DELETE135 ImgView2.rc // resource script #include windows.h #include "resource.h" // アクセラレータ IDR_MAIN ACCELERATORS BEGIN VK_RETURN,ID_ENTER,VIRTKEY// 0x0D VK_ESCAPE,ID_ESCAPE,VIRTKEY// 0x1B VK_LEFT,ID_LEFT,VIRTKEY// 0x25 VK_UP,ID_UP,VIRTKEY// 0x26 VK_RIGHT,ID_RIGHT,VIRTKEY// 0x27 VK_DOWN,ID_DOWN,VIRTKEY// 0x28 VK_DELETE,ID_DELETE,VIRTKEY// 0x2E "1",ID_SIZE_ADJUST,VIRTKEY// 0x31 VK_NUMPAD1,ID_SIZE_ADJUST,VIRTKEY// 0x61 "2",ID_SIZE_NORMAL,VIRTKEY// 0x32 VK_NUMPAD2,ID_SIZE_NORMAL,VIRTKEY// 0x62 "3",ID_EXECUTE,VIRTKEY// 0x33 VK_NUMPAD3,ID_EXECUTE,VIRTKEY// 0x63 END
https://w.atwiki.jp/sampleisbest/pages/51.html
開発環境 Microsoft Visual C++ 2010 Express (SP1) 実行環境 Microsoft Windows XP Home Edition (SP3) プロジェクトの種類 Win32 コンソール アプリケーション プロジェクト名 chkport アプリケーションの種類 コンソール アプリケーション 追加のオプション 空のプロジェクト chkport.c // インポート ライブラリ #pragma comment(lib, "ws2_32.lib") #include stdio.h #include WinSock2.h int main(int argc, char* argv[]) { WSADATAwsaData; HOSTENT*phe; SOCKETsock = INVALID_SOCKET; SOCKADDR_INname; char*pcHost; intiPort; intiRet; intiFlgStartup = 0; intiFlgConnect = 0; intiErrLv = 2;// 異常終了 if (argc != 3) { fprintf(stderr, "usage chkport host port\n"); goto Exit; } pcHost = argv[1]; iPort = atoi(argv[2]); // WinSockDLLの初期化 iRet = WSAStartup(MAKEWORD(2, 2), wsaData); if (iRet != 0) { printf("error WSAStartup %d\n", iRet); goto Exit; } iFlgStartup = 1; // IPアドレスの取得 phe = gethostbyname(pcHost); if (phe == NULL) { fprintf(stderr, "IPアドレスの取得に失敗しました。[%s]\n", pcHost); goto Exit; } // TCPソケット記述子の作成 sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == INVALID_SOCKET) { fprintf(stderr, "error socket\n"); goto Exit; } // サーバーに接続 name.sin_family= AF_INET; name.sin_port= htons(iPort); name.sin_addr= *((IN_ADDR*)phe- h_addr); iRet = connect(sock, (SOCKADDR*) name, sizeof name); if (iRet != 0) { printf("サーバーへの接続に失敗しました。\n"); iErrLv = 1;// サーバーへの接続に失敗 goto Exit; } iFlgConnect = 1; printf("サーバーへの接続に成功しました。\n"); iErrLv = 0;// 正常終了 Exit if (iFlgConnect) { shutdown(sock, SD_BOTH); } if (sock != INVALID_SOCKET) { closesocket(sock); } if (iFlgStartup) { WSACleanup(); } return iErrLv; } 出力 C \ chkport localhost 2222 サーバーへの接続に成功しました。 C \ echo %errorlevel% 0 C \ chkport localhost 2222 サーバーへの接続に失敗しました。 C \ echo %errorlevel% 1 C \ chkport hoge 2222 IPアドレスの取得に失敗しました。[hoge] C \ echo %errorlevel% 2 test.bat @echo off loop chkport localhost 2222 if errorlevel 2 goto exit if errorlevel 1 goto connrefused goto exit connrefused sleep 5 goto loop exit pause