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

  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);
	}
}
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ