|
|
#include <lightbox.h>
LboxListview *Lview;
LRESULT CALLBACK About( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
switch( message )
{
case WM_INITDIALOG:
Lview = new LboxListview( GetDlgItem( hDlg, IDC_LIST1 ) );
return TRUE;
case WM_COMMAND:
if( LOWORD(wParam) == IDCANCEL ) {
EndDialog(hDlg, LOWORD(wParam));
delete Lview;
return TRUE;
}
if( LOWORD(wParam) == IDC_BUTTON1 ) {
Lview->AddColumn( LVCFMT_LEFT, 70, "コード" );
Lview->AddColumn( LVCFMT_LEFT, 150, "氏名" );
Lview->AddColumn( LVCFMT_LEFT, 150, "フリガナ" );
Lview->AddColumn( LVCFMT_LEFT, 100, "電話番号" );
}
break;
}
return FALSE;
}
| |
|
|
|
|
#include <lightbox.h>
LboxListview *Lview;
LRESULT CALLBACK About( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam )
{
switch( message )
{
case WM_INITDIALOG:
Lview = new LboxListview( GetDlgItem( hDlg, IDC_LIST1 ) );
Lview->AddColumn( LVCFMT_LEFT, 70, "コード" );
Lview->AddColumn( LVCFMT_LEFT, 150, "氏名" );
Lview->AddColumn( LVCFMT_LEFT, 150, "フリガナ" );
Lview->AddColumn( LVCFMT_LEFT, 100, "電話番号" );
Lview->Grid();
return TRUE;
case WM_COMMAND:
if( LOWORD(wParam) == IDCANCEL ) {
EndDialog(hDlg, LOWORD(wParam));
delete Lview;
return TRUE;
}
// 行追加
if( LOWORD(wParam) == IDC_BUTTON1 ) {
Lview->AddRow();
Lview->AddRow();
Lview->AddRow();
Lview->AddRow();
}
// カレント行設定
if( LOWORD(wParam) == IDC_BUTTON2 ) {
Lview->SetCurrentRow( 1 );
}
// カラムテキストを設定
if( LOWORD(wParam) == IDC_BUTTON3 ) {
Lview->SetColumnText( 0, "0001" );
Lview->SetColumnText( 1, "山田太郎" );
Lview->SetColumnText( 2, "ヤマダタロウ" );
Lview->SetColumnText( 3, "123-456-7890" );
}
break;
}
return FALSE;
}
| |
|
|
|
エディットコントロールのフック無し
エディットコントロールのフック有り
|
// *********************************************************
// 拡張コンストラクタ
// *********************************************************
LboxListview::LboxListview( HWND hList, DWORD dwFlag )
{
LboxListview::hWnd = hList;
LboxListview::hEdit = NULL;
LboxListview::hEdit =
LboxCreateEdit( hList, 50001 );
if ( LboxListview::hEdit != NULL ) {
HFONT hFont;
hFont = (HFONT)SendMessage( hList, WM_GETFONT, 0, 0 );
SendMessage( LboxListview::hEdit, WM_SETFONT, (WPARAM)hFont, 0 );
LboxMoveWindowTop( LboxListview::hEdit );
}
if ( dwFlag & 0x00000001 ) {
hhk = SetWindowsHookEx(
WH_CALLWNDPROCRET,
CallWndRetProc,
NULL,
GetCurrentThreadId()
);
}
LboxListview::hMenu = NULL;
LboxListview::hFont = NULL;
}
| |
|
※ フックは、最初に作成するリストビューのみに使用します。二つ目以降のリストビューは、フック無しのほうを使用して下さい
|
#define LBOX_EN_LISTVIEW WM_USER + 1
// *********************************************************
// エディットコントロール用のフックプロシージャ
// *********************************************************
LRESULT CALLBACK CallWndRetProc(
int code,// フックコード
WPARAM wParam,// 削除フラグ
LPARAM lParam// メッセージが入った構造体へのポインタ
)
{
CWPRETSTRUCT *msg;
HWND hOwner;
HWND hListview;
msg = (CWPRETSTRUCT *)lParam;
if ( LOWORD(msg->wParam) == 50001 ) {
if ( msg->message == WM_COMMAND ) {
hListview = GetParent( (HWND)msg->lParam );
hOwner = GetParent( hListview );
if ( msg->message == WM_COMMAND ) {
SendMessage(
hOwner,
LBOX_EN_LISTVIEW,
msg->wParam,
msg->lParam
);
}
if ( HIWORD(msg->wParam) == EN_KILLFOCUS ) {
char *szBuffer = new char[512];
GetWindowText(
(HWND)msg->lParam,
szBuffer,
512
);
ListView_SetItemText(
hListview,
nEditRow,
nEditCol,
szBuffer
)
ShowWindow( (HWND)msg->lParam, SW_HIDE );
delete [] szBuffer;
}
}
}
return CallNextHookEx( hhk, code, wParam, lParam );
}
| |
|
|
|
|
// *********************************************************
// リストビューに列挿入
// 戻り値 : 無し
// nFmt 用定数
// LVCFMT_CENTER : 中央
// LVCFMT_LEFT : 左寄せ
// LVCFMT_RIGHT : 右寄せ
// *********************************************************
void LboxListview::InsertColumn(
int nCol, int nFmt, int nWidth, LPTSTR szTitle
)
{
#if CODING == 1
LVCOLUMNA col;
#else
LV_COLUMN col;
#endif
ZeroMemory( &col, sizeof( LV_COLUMN ) );
col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;
col.fmt = nFmt;
col.cx = nWidth;
col.pszText = szTitle;
ListView_InsertColumn(hWnd, nCol, &col);
}
// *********************************************************
// リストビューに列追加
// 戻り値 : 無し
// *********************************************************
void LboxListview::AddColumn(
int nFmt, int nWidth, LPTSTR szTitle
)
{
int nCol;
#if CODING == 1
LVCOLUMNA col;
#else
LV_COLUMN col;
#endif
ZeroMemory( &col, sizeof( LV_COLUMN ) );
col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;
col.fmt = nFmt;
col.cx = nWidth;
col.pszText = szTitle;
nCol = LboxListview::ColumnCount( );
ListView_InsertColumn(hWnd, nCol, &col);
}
| |
|
|
|
|
// *********************************************************
// リストビューの列数取得
// 戻り値 : 列数
// *********************************************************
int LboxListview::ColumnCount( void )
{
int i;
#if CODING == 1
LVCOLUMNA test;
#else
LV_COLUMN test;
#endif
ZeroMemory( &test, sizeof( LV_COLUMN ) );
test.mask = LVCF_FMT;
i = 0;
while( 1 ) {
if ( !ListView_GetColumn( hWnd, i, &test ) ) {
break;
}
i++;
if ( i > 100 ) {
break;
}
}
return i;
}
// *********************************************************
// リストビューの列のテキストを設定
// 戻り値 : 無し
// *********************************************************
void LboxListview::SetColumnText( int nCol, LPTSTR szBuffer )
{
ListView_SetItemText(
LboxListview::hWnd,
LboxListview::nCurrentRow,
nCol,
szBuffer
)
}
// *********************************************************
// リストビューの列のテキストを取得
// 戻り値 : 無し
// *********************************************************
void LboxListview::GetColumnText( int nCol, LPTSTR szBuffer, int nSize )
{
ListView_GetItemText(
LboxListview::hWnd,
LboxListview::nCurrentRow,
nCol,
szBuffer,
nSize
)
}
// *********************************************************
// リストビューの列のタイトルを設定
// 戻り値 : 無し
// *********************************************************
void LboxListview::SetColumnTitle( int nCol, LPTSTR szBuffer )
{
#if CODING == 1
LVCOLUMNA col;
#else
LV_COLUMN col;
#endif
ZeroMemory( &col, sizeof( LV_COLUMN ) );
col.mask = LVCF_TEXT;
col.pszText = szBuffer;
ListView_SetColumn(
LboxListview::hWnd,
nCol,
&col
);
}
// *********************************************************
// リストビューの列のタイトルを取得
// 戻り値 : 無し
// *********************************************************
void LboxListview::GetColumnTitle( int nCol, LPTSTR szBuffer, int nSize )
{
#if CODING == 1
LVCOLUMNA col;
#else
LV_COLUMN col;
#endif
ZeroMemory( &col, sizeof( LV_COLUMN ) );
col.mask = LVCF_TEXT;
col.pszText = szBuffer;
col.cchTextMax = nSize;
ListView_GetColumn(
LboxListview::hWnd,
nCol,
&col
);
}
// *********************************************************
// リストビューの列の幅を設定
// 戻り値 : 無し
// *********************************************************
void LboxListview::SetColumnWidth( int nCol, int nSize )
{
ListView_SetColumnWidth(
LboxListview::hWnd,
nCol,
nSize
);
}
// *********************************************************
// リストビューの列の幅を取得
// 戻り値 : 列の幅
// *********************************************************
int LboxListview::GetColumnWidth( int nCol )
{
return ListView_GetColumnWidth(
LboxListview::hWnd,
nCol
);
}
// *********************************************************
// リストビューの列を削除
// 戻り値 : 無し
// *********************************************************
void LboxListview::DeleteColumn( int nCol )
{
ListView_DeleteColumn(
LboxListview::hWnd,
nCol
);
}
| |
|
|
|
対象カラムデータをエディットコントロールへセットして表示させます
|
// *********************************************************
// リストビューのカラムデータをエディットコントロールにセット
// 戻り値 : 無し
// *********************************************************
void LboxListview::LoadColumnText( int nRow, int nCol )
{
char *szBuffer = new char[512];
ListView_GetItemText(
LboxListview::hWnd,
nRow,
nCol,
szBuffer,
512
);
SetWindowText( LboxListview::hEdit, szBuffer );
RECT rt;
ListView_GetSubItemRect(
LboxListview::hWnd,
nRow,
nCol,
LVIR_LABEL,
&rt
);
LboxMoveWindow(
LboxListview::hEdit,
rt.left,
rt.top
);
LboxChangeWindowSize(
LboxListview::hEdit,
rt.right - rt.left,
rt.bottom - rt.top + 3
);
ShowWindow( LboxListview::hEdit, SW_SHOW );
SetFocus( LboxListview::hEdit );
nEditRow = nRow;
nEditCol = nCol;
delete [] szBuffer;
}
| |
|
|
|
以下 FindNextSelectedRow の使用例
|
char *szTag1 = "<TABLE >";
char *szTag2 = "<TR>";
char *szTag3 = "</TR>";
char *szTag4 = "<TD>";
char *szTag5 = "</TD>";
char *szTag6 = "</TABLE>";
char *szTag7 = "<TH>";
char *szTag8 = "</TH>";
// *********************************************************
// クリップボードにコピー
// 行の終わりには、改行コードを付加
// bSelect が true の場合は 選択した行のみコピーする
// bTitle が true の場合は、タイトルもコピーする
// nType
// 0 : タブ
// 1 : カンマ(CSV)
// 3 : \
// 4 : HTML テーブルタグ
// 戻り値 : true 成功, false 失敗
// *********************************************************
BOOL LboxListview::CopyClipboard( BOOL bSelect, BOOL bTitle, int nType )
{
DWORD nRows,nCols;
DWORD nSize;
DWORD i;
char *szBuffer = new char[MAX_PATH];
if ( nType < 0 || nType > 3 ) {
return false;
}
char delim[3][4];
lstrcpy( delim[0], "\t" );
lstrcpy( delim[1], "," );
lstrcpy( delim[2], "\\" );
nRows = LboxListview::Count();
nCols = LboxListview::ColumnCount();
nSize = 0;
if ( bTitle ) {
for( i = 0; i < nCols; i++ ) {
LboxListview::GetColumnTitle(
i,
szBuffer,
MAX_PATH
);
nSize += lstrlen( szBuffer );
nSize++;
if ( nType == 3 ) {
nSize += lstrlen( szTag7 );
nSize += lstrlen( szTag8 );
}
}
nSize++;
if ( nType == 3 ) {
nSize += lstrlen( szTag2 );
nSize += lstrlen( szTag3 );
}
}
int nRow;
nRow = -1;
while( LboxListview::FindNextRow( &nRow ) ) {
if ( bSelect ) {
if ( false == LboxListview::IsState(
nRow,
LVIS_SELECTED
) ) {
continue;
}
}
for( i = 0; i < nCols; i++ ) {
LboxListview::GetColumnText(
i,
szBuffer,
MAX_PATH
);
nSize += lstrlen( szBuffer );
nSize++;
if ( nType == 3 ) {
nSize += lstrlen( szTag4 );
nSize += lstrlen( szTag5 );
}
}
nSize++;
if ( nType == 3 ) {
nSize += lstrlen( szTag2 );
nSize += lstrlen( szTag3 );
}
}
if ( nType == 3 ) {
nSize += lstrlen( szTag1 );
nSize += lstrlen( szTag6 );
}
HGLOBAL hGlobal;
LPTSTR pMem;
hGlobal = GlobalAlloc(GHND, nSize + 128 );
if ( hGlobal == NULL ) {
return false;
}
pMem = (LPTSTR)GlobalLock( hGlobal );
if ( pMem == NULL ) {
GlobalFree( hGlobal );
return false;
}
*pMem = 0x00;
if ( nType == 3 ) {
lstrcat( pMem, szTag1 );
}
if ( bTitle ) {
if ( nType == 3 ) {
lstrcat( pMem, szTag2 );
}
for( i = 0; i < nCols; i++ ) {
if ( nType == 3 ) {
lstrcat( pMem, szTag7 );
}
else {
if ( i != 0 ) {
lstrcat( pMem, delim[nType] );
}
}
LboxListview::GetColumnTitle(
i,
szBuffer,
MAX_PATH
);
lstrcat( pMem, szBuffer );
if ( nType == 3 ) {
lstrcat( pMem, szTag8 );
}
}
if ( nType == 3 ) {
lstrcat( pMem, szTag3 );
}
lstrcat( pMem, "\n" );
pMem += lstrlen( pMem );;
}
nRow = -1;
while( LboxListview::FindNextRow( &nRow ) ) {
if ( bSelect ) {
if ( false == LboxListview::IsState(
nRow,
LVIS_SELECTED
) ) {
continue;
}
}
if ( nType == 3 ) {
lstrcat( pMem, szTag2 );
}
for( i = 0; i < nCols; i++ ) {
if ( nType == 3 ) {
lstrcat( pMem, szTag4 );
}
else {
if ( i != 0 ) {
lstrcat( pMem, delim[nType] );
}
}
LboxListview::GetColumnText(
i,
szBuffer,
MAX_PATH
);
lstrcat( pMem, szBuffer );
if ( nType == 3 ) {
lstrcat( pMem, szTag5 );
}
}
if ( nType == 3 ) {
lstrcat( pMem, szTag3 );
}
lstrcat( pMem, "\n" );
pMem += lstrlen( pMem );;
}
if ( nType == 3 ) {
lstrcat( pMem, szTag6 );
}
GlobalUnlock( hGlobal );
OpenClipboard( NULL );
EmptyClipboard();
SetClipboardData(CF_TEXT, hGlobal);
CloseClipboard();
delete [] szBuffer;
return true;
}
| |
|
|
// *********************************************************
// カラム幅とデータ幅との調整
// 戻り値 : 無し
// *********************************************************
void LboxListview::Fit( void )
{
int nStartRow,nEndRow,nCols,i,j;
int nLen,nMax;
char *szBuffer = new char[MAX_PATH];
nCols = LboxListview::Count();
LboxListview::GetInfo();
nStartRow = LboxListview::llvi.nCurVisibleTopIndex;
nEndRow = nStartRow + LboxListview::llvi.nVisibleCountPerPage;
for( i = 0; i < nCols; i++ ) {
LboxListview::GetColumnTitle( i, szBuffer, MAX_PATH );
nMax = ListView_GetStringWidth(
LboxListview::hWnd,
szBuffer
);
for( j = nStartRow; j <= nEndRow; j++ ) {
LboxListview::SetCurrentRow( j );
LboxListview::GetColumnText( i, szBuffer, MAX_PATH );
nLen = ListView_GetStringWidth(
LboxListview::hWnd,
szBuffer
);
if ( nLen > nMax ) {
nMax = nLen;
}
}
nMax += 14;
LboxListview::SetColumnWidth( i, nMax );
}
delete [] szBuffer;
}
| |
|
|
|
|
// *********************************************************
// フォントのセット
// 戻り値 : true 成功, false 失敗
// *********************************************************
BOOL LboxListview::SetFont( int nType, int nSize, BOOL bBold )
{
if ( LboxListview::hFont != NULL ) {
DeleteObject( LboxListview::hFont );
}
LboxListview::hFont = LboxCreateFont(
nType,
nSize,
bBold
);
if ( LboxListview::hFont == NULL ) {
return false;
}
SendMessage(
LboxListview::hWnd,
WM_SETFONT,
(WPARAM)(LboxListview::hFont),
MAKELPARAM(true, 0)
);
return true;
}
// *********************************************************
// 全ての行の選択状態の変更
// 戻り値 : 無し
// bFlg が true ならば選択、false ならば選択解除
// *********************************************************
void LboxListview::SetSelectAll( BOOL bFlg )
{
int nRow;
nRow = -1;
while( LboxListview::FindNextRow( &nRow ) ) {
LboxListview::SetSelect( nRow, bFlg );
}
}
// *********************************************************
// カラムヘッダーの表示・非表示
// 戻り値 : 無し
// *********************************************************
void LboxListview::ShowColumnHeader( BOOL bShow )
{
if ( bShow ) {
LboxRemoveWindowStyle(
LboxListview::hWnd,
LVS_NOCOLUMNHEADER
);
}
else {
LboxAddWindowStyle(
LboxListview::hWnd,
LVS_NOCOLUMNHEADER
);
}
}
// *********************************************************
// 指定行、指定カラムを表示位置にスクロール
// 戻り値 : 無し
// *********************************************************
void LboxListview::Scroll( int nRow, int nCol )
{
POINT pt;
int i,nWidth;
RECT rt;
ListView_GetItemPosition(
LboxListview::hWnd,
nRow-1,
&pt
);
ListView_GetViewRect(
LboxListview::hWnd,
&rt
);
nWidth = -1024;
ListView_Scroll(
LboxListview::hWnd,
-1024,
0
);
nWidth = 0;
for( i = 0; i < nCol; i++ ) {
nWidth += LboxListview::GetColumnWidth( i );
}
ListView_Scroll(
LboxListview::hWnd,
nWidth,
pt.y
);
}
| |
|
|
|