i am in need of a simple windows API (none MFC) tab control example which
sould be compileable in MSVC++ 6.0.
I hope you can help me and thanks in advance:
MIKE: jus...@magnet.at
#include <windows.h>
#include <commctrl.h>
#include "resource.h"
LRESULT CALLBACK MainProc(HWND, UINT, WPARAM, LPARAM);
HWND hMain=NULL;
HINSTANCE hInst;
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
WNDCLASS wc;
hInst=hInstance;
wc.style=CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc=(WNDPROC)MainProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL, IDI_WINLOGO);
wc.hCursor=LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName="MENU";
wc.lpszClassName="TabCtrl Example";
if(!RegisterClass(&wc))
return FALSE;
hMain=CreateWindow(
"TabCtrl Example",
"탭 컨트롤 (TabCtrl)",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
if(!hMain)
return FALSE;
ShowWindow(hMain, nCmdShow);
UpdateWindow(hMain);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}
HWND hTab=NULL;
HWND hStatic=NULL;
HWND hEdit=NULL;
LRESULT CALLBACK MainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
lParam)
{
switch(uMsg)
{
// TabCtrl_InsertItem
// 2개의 아이템을 가지고 있는 탭 컨트롤을 만든다
case WM_CREATE:
InitCommonControls();
hTab=CreateWindowEx(0, WC_TABCONTROL, "",
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,
5, 5, 500, 300, hWnd, (HMENU)1, hInst, NULL);
hStatic=CreateWindowEx(0, "STATIC", "Static Control",
WS_CHILD | WS_VISIBLE | WS_BORDER,
50, 50, 100, 30, hWnd, (HMENU)2, hInst, NULL);
hEdit=CreateWindowEx(0, "EDIT", "Edit Control",
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE |
ES_AUTOVSCROLL | ES_AUTOHSCROLL | WS_VSCROLL | WS_HSCROLL,
50, 100, 400, 150, hWnd, (HMENU)3, hInst, NULL);
if(hTab)
{
TC_ITEM ti;
ti.mask=TCIF_TEXT;
ti.pszText="Item 1";
TabCtrl_InsertItem(hTab, 1, &ti);
ti.pszText="Item 2";
TabCtrl_InsertItem(hTab, 2, &ti);
}
EnableWindow(hEdit, FALSE);
return TRUE;
// break 문으로 끝났음에 유의
case WM_NOTIFY:
switch( ((NMHDR *)lParam)->code )
{
// 키가 눌러졌을때 발생
case TCN_KEYDOWN:
{
TC_KEYDOWN *tk=(TC_KEYDOWN *)lParam;
char buf[100]={0,};
wsprintf(buf, "wVKey [%d]\nflags [%d]\n",
tk->wVKey, tk->flags);
MessageBox(hWnd, buf, "TCN_KEYDOWN", MB_OK);
}
break;
// 선택된 탭이 바뀌면 발생
case TCN_SELCHANGE:
{
int index=(int)LOWORD(wParam);
char buf[100]={0,};
wsprintf(buf, "변경된 탭의 색인 [%d]\n", index);
MessageBox(hWnd, buf, "TCN_SELCHANGE", MB_OK);
}
break;
}
break;
case WM_COMMAND:
switch( LOWORD(wParam) )
{
// TabCtrl_DeleteAllItems
// 모든 아이템을 제거한다
case ID_DELETEALLITEMS:
TabCtrl_DeleteAllItems(hTab);
break;
// TabCtrl_DeleteItem
// 2번째 아이템을 제거한다
case ID_DELETEITEM:
TabCtrl_DeleteItem(hTab, 1);
break;
// TabCtrl_GetCurFocus
// 현재 Focus 를 가지고 있는 탭 컨트롤의 색인을 구한다
case ID_GETCURFOCUS:
{
int nResult=TabCtrl_GetCurFocus(hTab);
char buf[100]={0,};
wsprintf(buf, "Result : %d", nResult);
MessageBox(hWnd, buf, "TabCtrl_GetCurFocus", MB_OK);
}
break;
// TabCtrl_GetCurSel
// 현재 선택된 탭의 색인을 구한다
case ID_GETCURSEL:
{
int nResult=TabCtrl_GetCurSel(hTab);
char buf[100]={0,};
wsprintf(buf, "Result : %d", nResult);
MessageBox(hWnd, buf, "TabCtrl_GetCurSel", MB_OK);
}
break;
// TabCtrl_GetImageList
// 탭 컨트롤과 관련된 이미지 리스트를 구한다
case ID_GETIMAGELIST:
{
HIMAGELIST hImageList=TabCtrl_GetImageList(hTab);
if(!hImageList)
MessageBox(hWnd, "이미지 리스트가 없습니다.",
"TabCtrl_GetImageList", MB_OK);
else
{
char buf[100]={0,};
wsprintf(buf, "탭 컨트롤과 연관된 이미지 리스트: %xh", hImageList);
MessageBox(hWnd, buf, "TabCtrl_GetImageList", MB_OK);
}
}
break;
// TabCtrl_GetItem
// 정보를 구한다
case ID_GETITEM:
{
char buf[100]={0,};
TC_ITEM ti;
ti.mask=TCIF_TEXT;
ti.pszText=buf;
ti.cchTextMax=100;
TabCtrl_GetItem(hTab, 0, &ti);
char temp[200]={0,};
wsprintf(temp, "pszText [%s]\ncchTextMax [%d]\n",
ti.pszText, ti.cchTextMax);
MessageBox(hWnd, temp, "TabCtrl_GetItem", MB_OK);
}
break;
// TabCtrl_GetItemCount
// 탭 컨트롤에서 탭의수를 구한다
case ID_GETITEMCOUNT:
{
int nResult=TabCtrl_GetItemCount(hTab);
char buf[100]={0,};
wsprintf(buf, "Result : %d", nResult);
MessageBox(hWnd, buf, "TabCtrl_GetItemCount", MB_OK);
}
break;
// TabCtrl_GetItemRect
// 사각형의 크기를 구한다
case ID_GETITEMRECT:
{
RECT rect;
TabCtrl_GetItemRect(hTab, 0, &rect);
char buf[100]={0,};
wsprintf(buf, "[%d,%d] -- [%d,%d]",
rect.left, rect.top, rect.right, rect.bottom);
MessageBox(hWnd, buf, "TabCtrl_GetItemRect", MB_OK);
}
break;
// TabCtrl_GetRowCount
// 탭 컨트롤에 있는 탭의 행의 수를 구한다
case ID_GETROWCOUNT:
{
int nResult=TabCtrl_GetRowCount(hTab);
char buf[100]={0,};
wsprintf(buf, "Result : %d", nResult);
MessageBox(hWnd, buf, "TabCtrl_GetRowCount", MB_OK);
}
break;
// TabCtrl_GetToolTips
// 탭 컨트롤과 연관된 툴팁 컨트롤의 핸들을 구한다
case ID_GETTOOLTIPS:
{
HWND hToolTip=TabCtrl_GetToolTips(hTab);
if(!hToolTip)
MessageBox(hWnd, "툴팁 컨트롤이 없습니다.",
"TabCtrl_GetToolTips", MB_OK);
else
{
char buf[100]={0,};
wsprintf(buf, "탭 컨트롤과 연관된 툴팁 컨트롤: %xh", hToolTip);
MessageBox(hWnd, buf, "TabCtrl_GetToolTips", MB_OK);
}
}
break;
// TabCtrl_HitTest
// 5,5 에 있는 대상을 확인
case ID_HITTEST:
{
TC_HITTESTINFO info;
info.pt.x=5; info.pt.y=5;
TabCtrl_HitTest(hTab, &info);
char buf[100]={0,};
wsprintf(buf, "[%d,%d]\nflags [%d]\n",
info.pt.x, info.pt.y, info.flags);
switch(info.flags)
{
case TCHT_NOWHERE:
lstrcat(buf, "TCHT_NOWHERE");
break;
case TCHT_ONITEM:
lstrcat(buf, "TCHT_ONITEM");
break;
case TCHT_ONITEMICON:
lstrcat(buf, "TCHT_ONITEMICON");
break;
case TCHT_ONITEMLABEL:
lstrcat(buf, "TCHT_ONITEMLABEL");
break;
default:
lstrcat(buf, "ERROR");
break;
}
MessageBox(hWnd, buf, "TabCtrl_HitTest", MB_OK);
}
break;
// TabCtrl_InsertItem
// 아이템을 중간에 하나 추가한다
case ID_INSERTITEM:
{
TC_ITEM item;
item.mask=TCIF_TEXT;
item.pszText="Insert Item";
TabCtrl_InsertItem(hTab, 1, &item);
}
break;
// TabCtrl_SetCurSel
// 색인이 1인 페이지를 선택한다
case ID_SETCURSEL:
TabCtrl_SetCurSel(hTab, 1);
break;
// TabCtrl_SetItem
// 색인이 1인 페이지의 속성을 바꾼다
case ID_SETITEM:
{
TC_ITEM item;
item.mask=TCIF_TEXT;
item.pszText="SetItem";
TabCtrl_SetItem(hTab, 1, &item);
}
break;
// TabCtrl_SetItemExtra
// 탭 컨트롤이 탭을 가지지 않을때,
// 추가 데이터의 크기를 100 으로 설정
case ID_SETITEMEXTRA:
if( TabCtrl_SetItemExtra(hTab, 100) )
MessageBox(hWnd, "함수 성공", "TabCtrl_SetItemExtra", MB_OK);
else
MessageBox(hWnd, "함수 실패", "TabCtrl_SetItemExtra", MB_OK);
break;
// TabCtrl_SetItemSize
// 픽셀 단위로 탭의 새로운 폭, 높이를 설정한다
case ID_SETITEMSIZE:
TabCtrl_SetItemSize(hTab, 200, 30);
break;
// TabCtrl_SetPadding
case ID_SETPADDING:
TabCtrl_SetPadding(hTab, 50, 100);
break;
}
return TRUE;
case WM_DESTROY:
PostQuitMessage(0);
return TRUE;
}
return (DefWindowProc(hWnd, uMsg, wParam, lParam));
}
Mike <jus...@magnet.at>이(가) 아래 메시지를
news:7oq5fn$i0l$1...@orudios.magnet.at에 게시하였습니다.
Mike a écrit :
> Take a look at Control Spy, containing excellent samples for every Common
> Control...
>
What (or where) is Control Spy - I never heared about it ?
> > i am in need of a simple windows API (none MFC) tab control example
which
> > sould be compileable in MSVC++ 6.0.
> > I hope you can help me and thanks in advance:
> >
--
Klaus-Werner Konrad
(ohne pfiffigen Spruch)
Mike wrote:
>
> Where can i find "Control Spy ?"
http://www.microsoft.com/msj/0998/code/controlspy.zip
Good bye!
--
My email address is intentionally invalid to foil spammers.
Delete the ".NOSPAM" to get my real email address.
I do this on my own time with my own money.