Win32API

FrontPage|FindPage|TitleIndex|RecentChanges| UserPreferences P RSS
MicroSoft 사의 가장 큰 재산. win32api라는 이름은 16bit 기반이었던 winapi를 32bit로 확장하면서 붙게 되었다. 하위호환성을 종교적으로 신봉한다.


win32api의 다른 구현물로는 wine[http]ReactOS가 있다.



아주 멋진 페이지로군요. 계속 발전시켜 나가셔서 좋은 지식소스가 되길 바랍니다. -- 안형진

추천 서적 : ProgrammingWindows CharlesPetzold

1. 프로그래밍 팁

[http]MSDN에 자세히 나와있는 내용들 아닌가요?

1.1. 리스트 박스 중간에 문자열 끼어넣기

SendMessage(hList,LB_INSERTSTRING,index,string);

1.2. DC를 얻는 방법

  1. 아무 곳에서나

HDC GetDC(HWND hWnd);
int ReleaseDC(HWND hWnd, HDC hDC);

  1. WM_PAINT에서

HDC BeginPaint(HWND hWnd);
BOOL EndPaint(HWND hWnd, CONST PAINTSTRUCT *lpPaint);

1.3. Edit Control 의 총 문자수 구하기

UINT iTotal;
char sBuffer[256]={0,};

iTotal = SendMessage(hEdit,EM_LINELENGTH,0,0) + 1;
//+1을 하지 않으면 GetWindowText에서 마지막 한 글자가 빠진다.
GetWindowText(hEdit,sBuffer,iTotal);

1.4. 대화상자 안의 자식 원도우 컨트롤 하기

HWND hEdit;
hEdit = GetDlgItem(hWnd, IDC_EDIT1);
SetWindowText(hEdit,"test");

1.5. 모달대화상자 만들기

  1. 리소스 만들기

  2. 프로시저 만들기

BOOL CALLBACK DialogProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
	switch(iMsg)
	{
	case WM_INITDIALOG:
		return true;

	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDOK:
		case IDCANCEL:
			EndDialog(hWnd, true);
			return true;
		}
		break;
	}

	return false;
}

  1. 대화상자 호출

DialogBox(g_hInst, (LPSTR)IDD_GOTO_DIALOG, hWnd, DialogProc);

1.6. 포커스 관련 API

case WM_SETFOCUS:
	SetFocus(hEdit);
	return 0;

1.7. 타이틀바 없을때 클라이언트 영역을 눌렀을 때 마우스로 윈도우 움직이기

static bool bClk=false;
POINT old_point,new_point;
static POINT t_point;

case WM_LBUTTONDOWN:
	bClk = true;
		
	//시작지점
	t_point.x = LOWORD(lParam);
	t_point.y = HIWORD(lParam);	

	return 0;
case WM_LBUTTONUP:
	bClk = false;
	return 0;
case WM_MOUSEMOVE:
	if(bClk)
	{	
		new_point.x = LOWORD(lParam);
		new_point.y = HIWORD(lParam);
		ClientToScreen(hWnd,&new_point);
		new_point.x = new_point.x - t_point.x;
		new_point.y = new_point.y - t_point.y;
		
		MoveWindow(hWnd, new_point.x,new_point.y,bx,by,true);
	}
	return 0;

1.8. 팝업메뉴

메뉴 리소스 만들고

HMENU hMenu,hPopup;

case WM_CONTEXTMENU:
	hMenu = LoadMenu(g_hInst,MAKEINTRESOURCE(IDR_MENU1));
	hPopup = GetSubMenu(hMenu,0);
	TrackPopupMenu(hPopup,TPM_LEFTALIGN,LOWORD(lParam),HIWORD(lParam),0,hWnd,NULL);
	DestroyMenu(hMenu);
	return 0;

1.9. 트레이

#define TRAY_NOTIFY (WM_APP + 100)

아이콘 만들고
NOTIFYICONDATA nid;

case WM_CREATE:
	nid.cbSize = sizeof(NOTIFYICONDATA);
	nid.hWnd = hWnd;
	nid.uID = 0;
	nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
	nid.uCallbackMessage = TRAY_NOTIFY;
	nid.hIcon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_ICON1)); //IDI_ICON1는 아이콘 리소스 이름.
	strcpy(nid.szTip,"YamCard");
	Shell_NotifyIcon(NIM_ADD, &nid);


case WM_DESTROY:
	nid.cbSize = sizeof(NOTIFYICONDATA);
	nid.hWnd = hWnd;
	nid.uID = 0;
	Shell_NotifyIcon(NIM_DELETE, &nid);

1.10. 열기 대화상자 추가법

Swing Containers (->) FileChooser, UI 밑에 생성, Inspector에서 Event 탭에서 actionPerformed() 이벤트 더블클릭, 다음을 입력
    if(JFileChooser.APPROVE_OPTION == jFileChooser1.showOpenDialog(this)){
       statusBar.setText("Opened " + jFileChooser1.getSelectedFile().getPath());
    }

1.11. 공통대화상자

OPENFILENAME ofn;

memset(&ofn,0,sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = "모든파일(*.*)\0*.*\0";
ofn.lpstrFile = lpstrFile;
ofn.lpstrFileTitle = lpstrFileTitle;
ofn.nMaxFile = MAX_PATH;
ofn.nMaxFileTitle = MAX_PATH;
if(GetOpenFileName(&ofn) != 0){
	ctr_hwnd = GetDlgItem(hWnd,IDC_LIST_PSDFILELIST);				
	//SendMessage(ctr_hwnd,LB_ADDSTRING,0,(LPARAM)lpstrFile);
	SendMessage(ctr_hwnd,LB_ADDSTRING,0,(LPARAM)lpstrFileTitle);
}

1.12. DDB로 투명 비트맵 출력

TransparentBlt(hdc,x,y,bitmap.bmWidth,bitmap.bmHeight,hdcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,RGB(0,0,0));
lib 추가
Msimg32.lib

2. Q/A

{{|
Q: Platform SDK core는 특정 API(DirectX, MediaPlayer 등 관련) 개발과 상관없는 일반 Windows API개발자라도 꼭 업데이트 해야하는 건가요?? --SKJK

A: 꼭 필요한건 아닌데요. 업데이트 된 기능들. 예를 들어 투명 비트맵 출력 하는 TransparentBlt 같은 최근 기술들을 사용할려면 필요합니다. -- OpenKwang
|}}



"; if (isset($options[timer])) print $menu.$banner."
".$options[timer]->Write()."
"; else print $menu.$banner."
".$timer; ?> # # ?>