スケルトンを関数毎にソース分割


  ListView.h




ソースを分割する為、どこからでも関数を呼び出せるように関数宣言をプロジェクトメインヘッダ内に置きます
また、変数もどこからでも参照できるように "MyEXTERN" というマクロ定数を指定して、このヘッダを呼び出す場所によって内容を変えれるようにしています

  

#include "resource.h"
#include <lightbox.h>

ATOM MyRegisterClass( HINSTANCE hInstance );
BOOL InitInstance( HINSTANCE, int );
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
LRESULT CALLBACK About( HWND, UINT, WPARAM, LPARAM );
void LoadFile( void );

#define MAX_LOADSTRING 100
#define ID_STATUS (LBOX_ID_BASE+1)

MyEXTERN HINSTANCE hInst;
MyEXTERN TCHAR szTitle[MAX_LOADSTRING];
MyEXTERN TCHAR szWindowClass[MAX_LOADSTRING];
MyEXTERN char szBuffer[1024];	// 共通作業バッファ
MyEXTERN LboxTool Tool;		// ツールオブジェクト
MyEXTERN LboxFileSystem Fs;	// ファイルシステムオブジェクト
MyEXTERN LboxDlg *Dlg;		// ダイアログオブジェクト
MyEXTERN LboxListview *Lview;	// ツリービューオブジェクト
  

  ListView.cpp




メインソースということで、#define MyEXTERN に定数が設定されていません。これによって、ListView.h 内の MyEXTERN は空文字に置き換えられます

  

#include "stdafx.h"

#define MyEXTERN
#include "ListView.h"

// *********************************************************
//  エントリポイント
// *********************************************************
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow )
{
	MSG msg;
	HACCEL hAccelTable;

	// グローバル ストリングを初期化します
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_LISTVIEW, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass( hInstance );

	// アプリケーションの初期化を行います:
	if( !InitInstance( hInstance, nCmdShow ) ) {
		return FALSE;
	}

	hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_LISTVIEW);

	// メイン メッセージ ループ:
	while( GetMessage(&msg, NULL, 0, 0) ) {
		if( !TranslateAccelerator (msg.hwnd, hAccelTable, &msg) ) {
			TranslateMessage( &msg );
			DispatchMessage( &msg );
		}
	}

	return msg.wParam;
}
  

  MyRegisterClass.cpp

#define MyEXTERN extern によって、ListView.h 内の MyEXTERN は extern に置き換えられます

  

#include "stdafx.h"

#define MyEXTERN extern
#include "ListView.h"

// *********************************************************
//  関数: MyRegisterClass
// *********************************************************
ATOM MyRegisterClass( HINSTANCE hInstance )
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX); 

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

	return RegisterClassEx( &wcex );
}
  

RegisterClassEx は、ウィンドウクラスを登録します。登録したクラスは、CreateWindow 関数 (または CreateWindowEx 関数) で使います

アプリケーションが登録したすべてのウィンドウクラスは、アプリケーションの終了時に自動的に削除されます


  InitInstance.cpp

  

#include "stdafx.h"

#define MyEXTERN extern
#include "ListView.h"

// *********************************************************
//   関数: InitInstance
// *********************************************************
BOOL InitInstance( HINSTANCE hInstance, int nCmdShow )
{
	HWND hWnd;

	hInst = hInstance;

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

	if( !hWnd ) {
		return FALSE;
	}

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

	return TRUE;
}
  

  WndProc.cpp

メインウインドウの処理を記述する場所ですが、ダイアログのみの処理なので開始と終了処理のみです

  

#include "stdafx.h"

#define MyEXTERN extern
#include "ListView.h"

// *********************************************************
//  関数: WndProc
// *********************************************************
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch( message ) {
		case WM_CREATE:
			return Tool.OnlyDialog(
				hWnd,
				(LPCTSTR)IDD_DIALOG1,
				(DLGPROC)About
			);

		case WM_DESTROY:
			PostQuitMessage( 0 );
			break;

		default:
			return DefWindowProc( hWnd, message, wParam, lParam );
	}
	return 0;
}
  

  About.cpp

  

#include "stdafx.h"

#define MyEXTERN extern
#include "ListView.h"

// *********************************************************
//   関数: About
// *********************************************************
LRESULT CALLBACK About( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
	switch( message ) {
		case WM_INITDIALOG:
			// オブジェクト作成
			Dlg = new LboxDlg( hDlg );
			Lview = new LboxListview(
				GetDlgItem( hDlg, IDC_LIST3 ),
				0
			);

			// カラム作成
			Lview->AddColumn( LVCFMT_LEFT, 150, "ファイル名" );
			Lview->AddColumn( LVCFMT_RIGHT, 50, "サイズ" );
			Lview->AddColumn( LVCFMT_LEFT, 150, "更新日" );
			Lview->AddColumn( LVCFMT_LEFT, 100, "" );
			Lview->AddColumn( LVCFMT_LEFT, 100, "8.3ファイル名" );

			// グリッド形式
			Lview->Grid();
			// ポップアップメニューを実装
			Lview->CreatePopup( IDR_MENU1, 0 );
			// ステータスバーを実装
			Dlg->StatusCreate( ID_STATUS );
			// ファイル一覧読み込み
			LoadFile( );

			return TRUE;

		case WM_NOTIFY:
			// 通知情報を収集
			Lview->Notify( lParam );

			// 該当リストビューからの通知の時
			if ( Lview->nCurrentId == IDC_LIST3 ) {
				// ダブルクリック
				if ( Lview->Action == NM_DBLCLK ) {
					// 正しく行が選択されていない時は何もしない
					if ( Lview->nCurrentRow == -1 ) {
						break;
					}
					
					// ファイル名を取得
					Lview->GetColumnText(
						0,
						szBuffer,
						sizeof( szBuffer )
					);
					// ディレクトリならば、そこへ移動して一覧表示
					if ( Fs.IsDirectory( szBuffer ) ) {
						Fs.ChangeDirectory( szBuffer );
						LoadFile( );
					}
				}
			}
			break;

		case WM_COMMAND:
			// 終了処理
			if( LOWORD(wParam) == IDCANCEL ) {
				Dlg->End( LOWORD(wParam) );
				delete Lview;
				delete Dlg;
				return FALSE;
			}
			// メニュー処理
			if( LOWORD(wParam) == IDM_ACT1 ) {
			}
			if( LOWORD(wParam) == IDM_ACT2 ) {
			}
			break;
	}
	return FALSE;
}
  

  LoadFile.cpp

  

#include "stdafx.h"

#define MyEXTERN extern
#include "ListView.h"

#define ROW_TO_COLUMN(a) \
	szBuffer[0] = 0x00; \
	Dlg->ListGetText( \
		IDC_LIST2, \
		a, \
		szBuffer, \
		sizeof( szBuffer ) \
	); \
	Lview->SetColumnText( a, szBuffer );

// *********************************************************
// カレントディレクトリの情報をリストビューにセット
// *********************************************************
void LoadFile( void )
{
	Dlg->ListReset( IDC_LIST1 );
	Lview->Reset();

	LboxEnumFile( GetDlgItem( Dlg->hDlg, IDC_LIST1 ), 0 );

	int nRows,i;

	nRows = Dlg->ListCount( IDC_LIST1 );
	for( i = 0; i < nRows; i++ ) {
		Dlg->ListGetText(
			IDC_LIST1,
			i,
			szBuffer,
			sizeof( szBuffer )
		);
		Dlg->ListReset( IDC_LIST2 );
		Dlg->ListToken( IDC_LIST2, szBuffer, "\t" );

		szBuffer[0] = 0x00;
		Dlg->ListGetText(
			IDC_LIST2,
			0,
			szBuffer,
			sizeof( szBuffer )
		);
		if ( lstrcmp( szBuffer, "." ) == 0 ) {
			continue;
		}
		Lview->AddRow();
		Lview->SetColumnText( 0, szBuffer );

		ROW_TO_COLUMN(1);
		ROW_TO_COLUMN(2);
		ROW_TO_COLUMN(3);
		ROW_TO_COLUMN(4);
	}
}
  




yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


[cmaterial]
claudebot
24/03/29 17:12:41
InfoBoard Version 1.00 : Language=Perl

1 BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube