Assembly를 COM에 등록 명령어
gacutil : Assembly --> Global Assembly Cache

regasm : Assembly --> Registry

regsvcs : Assembly --> COM+

regsvr32 : 일반컴포넌트 --> Registry
Posted by 나비:D
:



출처 : http://blog.empas.com/bwangel/9314543


원문 : http://www.nullsoft.com/free/nsis/makensis.htm

주로 이용하는 것들 (NSIS/예제1, NSIS/예제2, NSIS/예제3 을 작성할 때 필요한 것 정도의 수준)위주로 정리. 좀 더 자세한 것에 대해서는 원문을 참조.
  1. Installer attributes
    1. General
    2. Install Directory
    3. License Page - 라이센스 관련 페이지에 쓰이는 속성들
    4. Component Page - 설치할 항목을 선택하는 페이지에 쓰이는 속성들
    5. Directory Page - 설치할 디렉토리를 선택하는 페이지에 쓰이는 속성들
    6. Install Page - 실질적인 Install 화면을 표시하는 페이지에 쓰이는 속성들
    7. Uninstall
  2. Compiler Flags
  3. Section
  4. Function (함수)
    1. 유의 사항
    2. attribute
  5. Labels
  6. Instructions
    1. Basic
    2. Registry/INI
    3. Advanced
    4. Branching/etc
    5. File/directory i/o
    6. Misc
    7. Strings
    8. Stack
    9. Integers
    10. Reboot
    11. Uninstall
  7. Variables
    1. modifiable variables that are usable in Instructions
    2. constant variables that are usable in Instructions and InstallDir
    3. usable anywhere in a string
  8. Uninstall Section
  9. Callback functions
    1. Install callback
    2. Uninstall callback
  10. Compiler utility commands
  11. Compiler defines / conditional compilation

Installer attributes

General

attribute parameter example 설명
OutFile? "example.exe" 인스톨러의 화일 이름
Name "zp_exam_project" 인스톨러 이름 (보통은 인스톨하려는 프로그램의 이름)
Caption "zeropage" 인스톨러의 titlebar 관련 caption. default는 "Name Setup"
SubCaption? 0 ": 라이센스기록" 인스톨러 각 페이지 관련 부타이틀


0 - License Agreement


1 - Installation Options


2 - Installation Directory


3 - Installing Files


4 - Completed
BrandingText? "ZeroPage Installer System v1.0" 인스톨러 하단부에 보여지는 텍스트
Icon "setup.ico" Installer 의 아이콘. 반드시 32*32*16 color 이여야 한다.
WindowIcon? on | off Icon 을 표시할 것인지 말것인지 결정
BGGradient 000000 308030 FFFFFF 그라데이션 배경화면의 이용. 16진수 RGB값으로 표현


기본인자는 off | topcolor bottomcolor captiontextcolor | notext
MiscButtonText? "이전" "다음" "취소" "닫기" 각 버튼들에 대한 text 설정 (순서대로)
InstallButtonText? "설치 Install 버튼에 대한 text 의 설정

Install Directory

attribute parameter example 설명
InstallDir? $PROGRAMFILESexample 기본 설치 디렉토리
InstallDirRegKey? . .

License Page - 라이센스 관련 페이지에 쓰이는 속성들

attribute parameter example 설명
LicenseText? "인스톨 하기 전 이 문구를 읽어주십시오" "동의합니다" license text 에서의 구체적 문구


인자는 text buttontext. buttontext 가 없으면 기본적으로 "I Agree"
LicenseData? zp_license.txt 해당 license 문구 텍스트가 담긴 화일

Component Page - 설치할 항목을 선택하는 페이지에 쓰이는 속성들

attribute parameter example 설명
ComponentText? "해당 컴포넌트를 골라주세요" 기본인자는 text subtext1 subtext2


component list 관련 표시될 텍스트.
InstType? "Full Install" Install 관련 component type 에 대한 정의. 순서대로 1,2,3,4...8 까지의 번호들이 매겨지며, 이는 추후 SectionIn? 에서 해당 component 에 대한 포함관계시에 적용된다.
EnabledBitmap? enabled.bmp component 선택 관련 체크된 항목 bitmap. 20*20*16 color bmp format.
DisabledBitmap? disabled.bmp component 선택 관련 체크되지 않은 항목 bitmap. 20*20*16 color bmp format.
SpaceTexts? "필요요구용량" "이용가능한용량" "Space required:", "Space available:" 에 대한 표현 관련 텍스트

Directory Page - 설치할 디렉토리를 선택하는 페이지에 쓰이는 속성들

attribute parameter example 설명
DirShow? show 디렉토리 설정 화면 표시여부
DirText? "설치할 디렉토리를 골라주십시오" "인스톨할 디렉토리설정" "폴더탐색" 디렉토리 선택 페이지에서의 각각 문구들의 설정.
AllowRootDirInstall? false 루트디렉토리에 설치할 수 있도록 허용할것인지에 대한 여부

Install Page - 실질적인 Install 화면을 표시하는 페이지에 쓰이는 속성들

attribute parameter example 설명
InstallColors? FFFF00 000000 foregroundcolor backgroundcolor. 또는 /windows 옵션을 이용가능
InstProgressFlags? smooth colored smooth, colored. colored 를 설정시는 InstallColors? 의 색으로 적용
AutoCloseWindow? false 인스톨 완료시 자동으로 인스톨 윈도우를 닫을것인지에 대한 여부
ShowInstDetails? show hide | show | nevershow . install 되는 화면을 보여줄 것인지에 대한 여부
DetailsButtonText? "Show Details" "Show details" 버튼의 text 에 대한 설정
CompletedText? "완료되었습니다" "Completed" 문구 text에 대한 설정

Uninstall

Uninstall 화면에 대한 설정들.
attribute parameter 설명
UninstallText? text subtext? .
UninstallIcon? path_to_icon.ico 32*32*16 color icon
UninstallCaption? caption .
UninstallSubCaption? page_number subcaption 0: Confirmation, 1:Uninstalling Files, 2:Completed
ShowUninstDetails? hide | show | nevershow .
UninstallButtonText? button text? .

Compiler Flags

Section

Section 은 설치를 위한 일종의 하나의 모듈, 컴포넌트이다. Section 과 InstType? 은 다르다.
InstType? 하나당 여러개의 Section 묶음으로 되어있는 것이다. 사용자는 각각의 Section 에 대해 활성/비활성화 함으로서 설치될 모듈들을 고를 수 있다.
단, Uninstall Section은 언인스톨을 위한 특수한 Section이다.
attribute parameter example 설명
Section "ZPTest Defaults Modules (required)" Section 의 시작을 알린다. Section의 이름을 설정. 만일 Section의 이름이 비어있거나 '-'로 시작되는 경우에는 사용자가 선택할 수 없고, 볼 수도 없다. (즉, 반드시 필요한 Section에 대해). 그리고 가장 처음으로 선언되는 Section은 default Section이 되며 역시 필수 Section이 된다.
SectionIn? 123 or 1-2-3 위에 적은 InstType? 에 포함되는 Type의 번호를 넣는다.
SectionEnd?
Section의 끝을 알리는 attribute
SectionDivider? " additional utilities " 각 Section 간 절취선. 중간에 text 넣기 가능
AddSize? 1000 kb 단위. 각 Section당 필요한 용량에 대해 적어준다.

Function (함수)

유의 사항

attribute

Function function_name 하당 함수이름으로 함수 선언
FunctionEnd?
함수의 끝을 알린다.

Labels

Label은 Goto 명령어나 기타 조건제어문들 (IfErrors?, MessageBox?, IfFileExists?, StrCmp? 등)을 위해 이용한다.
Label 은 반드시 Section 이나 Function 내에 존재해야 한다. Label 은 해당 Section 과 Function 내에서만 그 범위를 가진다.
선언은 간단하다.
MyLabel: 

Instructions

Basic

Instruction parameter 설명
SetOutPath? outpath output path를 설정한뒤 ($OUTDIR), 만일 해당 path가 존재하지 않으면 만든다. 반드시 full-pathname 이여야 하며 일반적으로 $INSTDIR 이 이용된다.
File (/r? file|wildcard ...?) | /oname=file.data infile.dat 해당 output path ($OUTDIR)에 화일들을 추가한다. 와일드카드 (?, *) 등을 이용할 수 있다. 만일 /r 옵션을 이용할 경우, 해당 화일들와 디렉토리들이 재귀적으로 추가된다. (rm -rf의 'r' 옵션의 의미를 생각하길)
Exec command 특정 프로그램을 실행하고 계속 다음진행을 한다. $OUTDIR 은 작업디렉토리로 이용된다. ex) Exec '"$INSTDIRcommand.exe" parameters'
ExecWait? command user_var(exit code)? 특정 프로그램을 실행시키고, 종료될 때까지 기다린다.
ExecShell? action command parameters? SW_SHOWNORMAL | SW_SHOWMAXIMIZED | SW_SHOWMINIMIZED? ShellExecute?를 이용, 프로그램을 실행시킨다. action은 보통 'open', 'print' 등을 말한다. $OUTDIR 은 작업디렉토리로 이용된다.
Rename /REBOOTOK? source_file dest_file 화일이름을 변경한다. (또는 Move 한다.)
Delete /REBOOTOK? file 화일을 삭제한다. 와일드카드 사용가능.
RMDir /r? directory 해당 디렉토리를 지운다. (full-path여야함)

Registry/INI

WriteRegStr? root_key subkey key_name value 레지스트리에 기록. root키의 경우 다음이 가능. HKCR - HKEY_CLASSES_ROOT


HKLM - HKEY_LOCAL_MACHINE


HKCU - HKEY_CURRENT_USER


HKU - HKEY_USERS


HKCC - HKEY_CURRENT_CONFIG


HKDD - HKEY_DYN_DATA


HKPD - HKEY_PERFORMANCE_DATA
WriteRegExpandStr? . .
WriteReg?DWORD . .
WriteRegBin? . .
WriteINIStr ini_filename section_name entry_name value ini 화일에 기록. section_name? entry_name=value 식으로 저장됨
ReadRegStr? . .
ReadReg?DWORD . .
ReadINIStr . .
ReadEnvStr? . .
ExpandEnvStrings? . .
DeleteRegValue? . .
DeleteRegKey? /ifempty? root_key subkey 레지스트리 키 삭제
EnumRegKey? . .
EnumRegValue? . .
DeleteINISec . .
DeleteINIStr . .

Advanced

CreateDirectory? path_to_create 디렉토리 생성
CopyFiles? . .
SetFileAttributes? . .
CreateShortCut? . .
GetFullPathName? . .
SearchPath? . .
GetTempFileName? . .
CallInst?DLL . .
RegDLL . .
UnReg?DLL . .
GetDllVersion? . .
GetDLLVersionLocal? . .
GetFileTime? . .
GetFileTimeLocal? . .

Branching/etc

Goto . .
Call . .
Return . .
IfErrors? . .
ClearErrors? . .
SetErrors? . .
FindWindow? . .
SendMessage? . .
IsWindow? . .
IfFileExists? . .
MessageBox? . .
StrCmp? . .
IntCmp? . .
IntCmp?U . .
Abort . .
Quit . .
GetFunctionAddress? . .
GetLabelAddress? . .
GetCurrentAddress? . .

File/directory i/o

FindFirst? . .
FindNext? . .
FindClose? . .
FileOpen? . .
FileClose? . .
FileRead? . .
FileWrite? . .
FileReadByte? . .
FileWriteByte? . .
FileSeek? . .

Misc

SetDetailsView? . .
SetDetailsPrint? . .
SetAutoClose? . .
DetailPrint? . .
Sleep . .
BringToFront? . .
HideWindow? . .

Strings

StrCpy? . .
StrLen? . .

Stack

Push . .
Pop . .
Exch . .

Integers

IntOp? . .
IntFmt? . .

Reboot

Reboot . .
IfRebootFlag? . .
SetRebootFlag? . .

Uninstall

  • WriteUninstaller? - uninstller 화일이름 설정. 보통 uninstall.exe 라고 써주면 됨. 단, 레지스트리에 등록시키는 화일과 같아야 한다.

Variables

modifiable variables that are usable in Instructions

constant variables that are usable in Instructions and InstallDir?

  • $PROGRAMFILES - program files 디렉토리. (보통 C:Program Files) 실행시 탐색된다.
  • $DESKTOP - 윈도우 데스트톱 디렉토리 (보통 C:windowsdesktop) 실행시 탐색된다.
  • $EXEDIR - installer 가 실행되는 위치
  • $WINDIR - windows 디렉토리 (보통 C:windows , C:winnt) 실행시 탐색된다.
  • $SYSDIR - windows system 디렉토리 (보통 C:windowssystem, C:winntsystem32) 실행시 탐색된다.
  • $TEMP - 시스템 임시 디렉토리 (보통 C:windowstemp) 실행시 탐색됨.
  • $STARTMENU - 시작메뉴 folder. (CreateShortCut? 을 이용, 시작메뉴에 등록시 유용하다.)
  • $SMPROGRAMS - 시작메뉴 programs folder (보통 $STARTMENUPrograms 대신 이용)
  • $SMSTARTUP - 시작메뉴 programs/startup folder. 즉, '시작프로그램'
  • $QUICKLAUNCH - IE4 이상. 퀵런치
  • $HWNDPARENT - parent window의 HWND 에 대한 10진수값.
  • $$ - '$' 표현시..

usable anywhere in a string

Uninstall Section

        Section "Uninstall" 
Delete $INSTDIRUninst.exe ; delete self (see explanation below why this works)
Delete $INSTDIRmyApp.exe
RMDir $INSTDIR
DeleteRegKey HKLM SOFTWAREmyApp
SectionEnd

Callback functions

Install callback

Uninstall callback

Compiler utility commands

Compiler defines / conditional compilation


Posted by 나비:D
:
출처 : http://www.cipher.pe.kr/tt/cipher/101

NSIS는 이미 알고 있듯이 스크립트로 만들어서 컴파일 하는 과정을 거치게 되어 있다. 아주 복잡한 인스톨 프로그램까지 만들 수 있지만, 천리길도 한 걸음부터라고 가장 기본부터 하나씩 정리해볼 생각이다. 누군가에게 도움이 되기를 바라는 마음도 있지만, 나 자신의 알고 있음을 한번 더 정리하는것도 크니 꾸준하게 정리해서 목표는 현재 곰플레이어 인스톨 하는 수준까지 만드는게 목표이다.

  1. NSIS를 다운 받자
    http://nsis.sourceforge.net/Main_Page

  2. 쓸만한 텍스트 에디터를 사용한다. 내가 생각하기에 제일 쉬운 에디터는 HM NIS Edit이다.
    http://hmne.sourceforge.net/
위의 두 프로그램을 다운 받아서 인스톨 하면 모든 준비는 끝이다. NSIS는 완전 free로 다운 받아서 쓰는데 상용화하는데도 전혀 문제가 없는 프로그램이다. HM NIS Edit 은 무료로 사용할 수도 있고 마음에 들어서 제작자에게 도움을 주고 싶으면 donation 할 수 있는 프로그램이다.

둘 다 인스톨 했으면 HM NIS Edit 을 실행한다. 이제 필요한 스크립트를 만들 준비가 다 되었다. HM NIS Edit의 "파일" 메뉴를 보면 위에서부터 네 개의 메뉴가 있다. 일반적인 에디터와 다르게 "스크립트 작성 마법사"를 사용하면 간단하게 인스톨 프로그램을 작성할 수 있다.
사용자 삽입 이미지
"인스톨-옵션 파일 만들기"는 플러그인을 활용하여 인스톨 중에 사용자로부터 선택을 받아서 인스톨 하는 프로그램을 만들때 사용할 수 있다. 처음에는 그냥 "빈 스크립트 만들기" 메뉴를 이용하여 전체적인 스크립트를 다 만들어 보도록 하겠다.

















1. Commands
NSIS 의 스크립트는 기본적으로 한 줄에 하나의 명령을 쓰게 되어 있다. 즉 한번에 해석되는 것이 한 줄 단위라는 것이다. 일반적으로 C의 경우 세미콜론(;) 단위로 실행되게 되어 있는데, NSIS는 줄 단위로 해석된다고 생각하면 된다. 만약 한 줄에 썼을때 에디터에서 보기도 힘들고 할 경우에는 끊고 싶은 부분에서 back-slash(\)를 쓰면 다음 줄까지 연결해서 해석 한다.
형태는 'command [parameters]' 로 사용한다.
예를 들자면

File "myfile"

와 같이 하면 " " 안에 있는 파일을 인스톨 프로그램에 포함시키면서 실제 인스톨시에는 현재 셋팅된 output 폴더에 인스톨을 한다. command에 대해서는 나중에 좀 더 자세하게 보도록 하겠다.

2. Comments
스크립트 언어 이므로 나중에 안 헷갈리기 위해서 가능한 주석을 달아 놓는게 좋다. 주석의 경우 세 가지 방법으로 주석을 나타낼 수 있다. ; 또는  # 을 사용할 경우 이 두 기호 이후부터 줄 끝까지를 주석으로 해석한다. 만약 한꺼번에 여러 줄을 주석으로 처리해야 할 경우는 C와 똑같은 주석을 쓸 수 있다. 즉 /*     */ 로 여러 줄을 한꺼번에 주석 처리할 수 있는 것이다. 만약 ; 나 # 을 파라메터로 넘겨줘야 할 경우는 "  " 로 감싸면 된다.

3. Plug-ins
NSIS에서 플러그인 이란 자체적으로 제공하지 않는 기능을 사용자가 직접 추가 하기 위한 방법을 제공하는 것이다. 이런 플러그인에 있는 command를 사용하기 위해서는

plugin::command [parameters]

형태로 쓴다. 물론 plugin 이란 실제 플러그인의 이름을 말하는 것이다. 추후 더 자세하게 플러그인에 대해서 볼 경우가 생길 것이다.

4. Numbers
숫자를 파라메터로 넘겨 줄 경우에는 10진수, 8진수(시작을 o로 할 경우), 16진수(시작을 ox)로 넘겨 줄 수 있다.

IntCmp 1 0x1 lbl_equal

5. Strings
문자열을 표시할때는 "와 "로 감싸면 공백을 포함한 문자열을 만들 수 있다. " 대신에 ' 또는 ` 등을 사용할 수 있다. 또한 문자열 안에서 "를 표시하기 위해서는 $\ 를 사용하면 된다.

  1.  
  2. MessageBox MB_OK "$\"A quote from a wise man$\" said the wise man"; "를 문자열 내에 포함
  3.  



문자열내에서 특별히 NSIS에서 변경할 수 없게 만들어 놓은 것들이 있다.
$$      $를 문자열 내에 표시할 경우 사용한다.
$\r    케리지 리턴을 표시한다
$\n    다음 줄을 표시한다.
$\t     탭을 표시한다.
위의 정확한 뜻은 예제를 하면서 한꺼번에 설명하도록 하겠다.

6. Variables
프로그래밍이 가능하므로 변수를 사용할 수 있다. 변수는 항상 시작을 $로 시작해야 한다. 그리고 사용하기전에 선언되어야 한다. 즉 실제로 사용하기전에 Var 라는 Command로 먼저 선언하고 사용해야 한다. Variables에 대해서도 뒤에 좀 더 자세하게 살펴 보겠다.

7. Long commands
명령어를 한 줄에 적다가 너무 길어지면 에디터에서 한 눈에 들어 오지 않으므로 여러 줄에 나누어서 작성하는 경우가 있다. 이럴때는 back-slash(\)를 사용하면 된다. 필요한 연결은 알아서 해준다.

CreateShortCut "$SMPROGRAMS\NSIS\ZIP2EXE project workspace.lnk" \
               "$INSTDIR\source\zip2exe\zip2exe.dsw"
MessageBox MB_YESNO|MB_ICONQUESTION \
                         "Do you want to remove all files in the folder? \
                          (If you have anything you created that you want \
                          to keep, click No)" \
                          IDNO NoRemoveLabel


위에 5번을 보면 주석문에도 \ 를 써서 다음 줄까지 주석문 임을 알릴 수 있지만 헷갈릴 수 있으므로 주석문에는 사용하지 않는게 좋다.

8. Configuration file
뒤에 따로 설명할 기회가 있을때 하겠다.


이상은 NSIS 메뉴얼 중에 Chapter 4 에 있는 Script File Format 이라는 부분에 있는 내용을 설명한 것이다. 이것만 가지고는 도대체 뭘 할지 알 수 없으니 예제를 하나 돌리면서 생각을 해보자

사용자 삽입 이미지

HM NIS Edit(앞으로 일반적으로 에디터라고 하면 이 에디터를 지칭한다) 에 위와 같이 글을 쓰고 나서 저장을 한다. 저장은 원하는 이름으로 저장하면 된다. 위에서 다른 부분은 신경쓰지 말고 현재는 command 중에서 outfile 에 파라메터로 주어진 값이 실제로 만들어지는 인스톨 프로그램이라는 것을 생각하자. 여기서는 "hello world.exe"로 만들었다. Section은 나중에 설명할테니 지금은 저렇게 Section 으로 시작하고 SectionEnd로 끝난다는 것만 기억하면 되겠다.
MessageBox의 경우 위에서 이미 설명한 것을 그대로 복사해서 만들었으니 실제로 실행했을때 어떻게 되는지 한번 보도록 하자. 실행을 하기 위해서는 먼저 컴파일을 하고 실행해야 하므로
사용자 삽입 이미지
아래와 같이 메뉴중에 NSIS 아래에 스크립트 컴파일 을 선택하면 컴파일이 되며, 컴파일 및 실행 을 선택하면 컴파일을 하고 자동으로 실행까지 해 주는 것이다. 일단 먼저 컴파일만 해보면 스크립트 파일을 저장한 폴더에 "hello world.exe" 파일이 생성된 것을 볼 수 있다. 이것을 한번 실행시켜 보자. 실행시키면 아래 그림과 같이 나오는 것을 볼 수 있다.

아래 그림에서 앞쪽에 나온 메시지 박스를 잘 보면 스크립트에서 적어 놓은데로 충실하게 출력을 하고 있는 것을 알 수 있다. 맨 앞에 물음표 아이콘이 바로 MB_ICONQUESTION 으로 지정된 것이며, MB_YESNO 가 버튼에서 예, 아니오 버튼이 나온 것이다. 그리고 문자열로 넘겨준 것들이 에디터에 보기 편하게 세줄로 나눈것이지 실제로 메시지 박스로 넘어 갈때는 한 줄로 해석되는 것을 알 수 있다.
사용자 삽입 이미지


간단하게 스크립트를 작성해서 어떻게 동작하는지를 알아 보았다. NSIS는 공개 소프트웨어라서 많은 사람들이 문서화를 해놓았다. 물론 NSIS 홈페이지에도 많은 문서가 있다. 웹에서 찾아 보면 더 많은 문서를 찾아 볼 수 있을 것이다. 여기에 적는 대부분의 내용은 NSIS에 있는 메뉴얼을 중심으로 필요한 내용만 뽑아서 예제를 많이 넣어서 이해하기 쉽게 적을려고 한다.

다음에는 Variables에 대해서 좀 더 자세하게 알아 보도록 하자.
참, 위에 메시지 박스에 적혀 있는 문자열에 $\r$\n 을 포함하여 어떻게 되는지 한번 보는 것도 좋은 경험이 될듯하다.
Posted by 나비:D
:
NSIS - 설치 스크립트 설명

정말 적기 힘드네요...
물론 이렇게 노가다로 일일히 안해도 됩니다.
HM NIS Edit 라는 스크립트 에디터 툴을 쓰시거나 Venis 라는 툴을 사용하셔도 됩니다.
하지만 한번 만들어 놓은 스크립트는 특별한 스크립트가 들어가지 않는한 변하질 않기 때문에 저 같은 경우 만들어 놓은걸 복사해서 일부분만 고쳐서 사용을 하죠...
아래 설치 스크립트에 대한 부분에 주석을 달아 놓았으니 참고하세요...^^

; 배포 프로그램 이름 지정

!define APPNAME "FreemontEncoder"

; 배포 프로그램의 이름 및 버전 표시 (실제 배포 프로그램 실행 시 화면에 표시되는 이름)

!define APPNAMEANDVERSION "FreemontEncoder 2.0"

<?xml:namespace prefix = o /> 

; Main Install settings

; 프로그램 이름 : 위에미리 정의한 APPNAMEANDVERSION을 지정한다.

Name "${APPNAMEANDVERSION}"

; 기본 설치 경로

InstallDir"$PROGRAMFILES\Freemont\Freemont Encoder"

; 배포 프로그램 정보가 등록될 레지스트리 경로

InstallDirRegKey HKLM"Software\${APPNAME}" ""

; 컴파일 후 배포 프로그램이 출력될 경로 지정

OutFile "C:\FMSSetup.exe"

 

; Modern interface settings

; UI Modern 으로설정한다.

!include "MUI.nsh"

 

; 경고 페이지 및 설치 종료 후 바로 실행할 파일 지정

!define MUI_ABORTWARNING

!define MUI_FINISHPAGE_RUN"$INSTDIR\Freemont Encoder.exe"

 

; 설치 및 삭제 아이콘 지정(주의 : 반드시 설치와 삭제 아이콘은 포멧이 일치해야 한다.)

!define MUI_ICON "res\FMS.ico"

!define MUI_UNICON"res\UnInstall.ico"

 

; 매크로 페이지 삽입

; 환영 메시지 페이지

!insertmacro MUI_PAGE_WELCOME

; 설치 경로 선택 페이지

!insertmacro MUI_PAGE_DIRECTORY

; 설치 상태 페이지 : 설치퍼센트 표시되는 페이지

!insertmacro MUI_PAGE_INSTFILES

; 완료 페이지

!insertmacro MUI_PAGE_FINISH

 

; 삭제 확인 페이지

!insertmacro MUI_UNPAGE_CONFIRM

; 삭제 상태 페이지 : 삭제퍼센트 표시되는 페이지

!insertmacro MUI_UNPAGE_INSTFILES

 

; Set languages (first is default language)

; 설치 시 표시 가능한 언어를 설정한다.

; 처음에 설정한 언어가 기본 언어가 된다.

!insertmacro MUI_LANGUAGE"Korean"

!insertmacro MUI_LANGUAGE"English"

!insertmacro MUI_RESERVEFILE_LANGDLL

 

; 설치 섹션

Section "Freemont Encoder"Section1

 

           ;설치 경로에 동일한 파일 존재 시 덮어씌우라는 의미

           SetOverwriteon

 

           ;파일이 설치될 경로를 위에서 지정한 INSTDIR 로 한다.

           SetOutPath"$INSTDIR\"

           ;INSTDIR 에 설치할 로컬 파일 경로를 지정한다.

           File"C\FMS\release\Freemont Encoder.exe"

           File"C\FMS\release\config.ini"

           ;파일이 설치될 경로를 windows\system32로 한다.

           ;일부 dll 이나 필수 파일 등등

           SetOutPath"$SYSDIR"

           ;windows\system32 에 설치할 로컬 파일 경로를 지정한다.

           File"C\FMS\release\FLogo.ax"

           ;dll 이나 ocx, ax 와 같이 레지스트리에 등록이 필요한 경우 (cmd : regsvr32.exe)

           RegDLL"$SYSDIR\FLogo.ax"

           ;바로 가기를 등록한다.

           ;바탕화면에 바로 가기 등록

           CreateShortCut"$DESKTOP\Freemont Encoder.lnk" "$INSTDIR\FreemontEncoder.exe"

           ;시작 프로그램에 바로 가기 등록

           CreateDirectory"$SMPROGRAMS\Freemont"

           CreateShortCut"$SMPROGRAMS\Freemont\Freemont Encoder\Freemont Encoder.lnk""$INSTDIR\Freemont Encoder.exe"

           CreateShortCut"$SMPROGRAMS\Freemont\Freemont Encoder\Uninstall.lnk""$INSTDIR\uninstall.exe"

SectionEnd

 

; 종료 섹션

Section -FinishSection

           ;종료 섹션은 특별한 일이 없는 이상 아래와 같이 설치하는 프로그램에 대한 정보를 레지스트리에 저장한다.

           WriteRegStrHKLM "Software\${APPNAME}" "" "$INSTDIR"

           WriteRegStrHKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}""DisplayName" "${APPNAME}"

           WriteRegStrHKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}""UninstallString" "$INSTDIR\uninstall.exe"

           WriteUninstaller"$INSTDIR\uninstall.exe"

SectionEnd

 

; Modern install component descriptions

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN

           !insertmacroMUI_DESCRIPTION_TEXT ${Section1} ""

!insertmacro MUI_FUNCTION_DESCRIPTION_END

 

; 삭제 섹션

Section Uninstall

 

           ;설치 정보 레지스트리를 삭제한다

           DeleteRegKeyHKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}"

           DeleteRegKeyHKLM "SOFTWARE\${APPNAME}"

 

           ;파일 삭제

           ;삭제 파일 삭제

           Delete"$INSTDIR\uninstall.exe"

          

           ;바로 가기 삭제

           Delete"$DESKTOP\Freemont Encoder.lnk"

           Delete"$SMPROGRAMS\Freemont\Freemont Encoder.lnk"

           Delete"$SMPROGRAMS\Freemont\Uninstall.lnk"

 

           ;설치 파일 삭제

           Delete"$INSTDIR\Freemont Encoder.exe"

           Delete"$INSTDIR\config.ini"

           ;windows\system32 에 설치된 파일에 대한 레지스트리 삭제 (cmd : regsvr32/u)

           UnRegDLL"$SYSDIR\FLogo.ax"

           ;레지스트리에서 삭제된 파일 삭제

           Delete"$SYSDIR\FLogo.ax"

 

           ;바로 가기 및 설치 디렉토리 삭제

           RMDir"$SMPROGRAMS\Freemont\Freemont Encoder"

           RMDir"$INSTDIR\"

 

SectionEnd

 

; 배포 프로그램 초기화 함수

Function .onInit

           ;설치 언어 선택 페이지를 표시한다.

           !insertmacroMUI_LANGDLL_DISPLAY

 

FunctionEnd

Posted by 나비:D
:
Table C-1. General
 
Command Shortcut Description
Edit.Copy CTRL-C Copies the currently selected item to the system clipboard.
CTRL-INSERT
Edit.Cut CTRL-X Deletes the currently selected item and moves it to the system clipboard.
SHIFT-DELETE
Edit.CycleClipboardRing CTRL-SHIFT- INS Pastes an item from the Clipboard Ring tab of the Toolbox at the cursor in the file and automatically selects the pasted item. You can cycle through the items on the clipboard by pressing the shortcut keys repeatedly.
CTRL-SHIFT-V
Edit.GoToNextLocation F8 Moves the cursor to the next item, such as a task in the TaskList window or a search match in the Find Results window.
Edit.GoToPreviousLocation SHIFT-F8 Moves the cursor to the previous item in the TaskList window or Find Results window.
Edit.GoToReference SHIFT-F12 Finds a reference to the selected item or the item under the cursor.
Edit.OpenFile CTRL-SHIFT-G Opens the file whose name is under the cursor or is currently selected (e.g., if you use this shortcut in a C++ file when the cursor is on a line with a #include statement, it will open the file being included).
Edit.Paste CTRL-V Inserts the item in the clipboard at the cursor.
SHIFT-INSERT
Edit.Redo CTRL-SHIFT-Z Redoes the previously undone action.
CTRL-Y
SHIFT-ALT-BACKSPACE
Edit.SelectionCancel ESC Closes a menu or dialog, cancels an operation in progress, or places focus in the current document window.
Edit.Undo ALT-BACKSPACE Reverses the last editing action.
CTRL-Z
File.Print CTRL-P Displays the Print dialog.
File.SaveAll CTRL-SHIFT-S Saves all documents and projects.
File.SaveSelectedItems CTRL-S Saves the selected items in the current project (usually whichever source file is currently visible).
Tools.GoToCommandLine CTRL-/ Switches focus to the Find/Command box on the Standard toolbar.
View.NextTask CTRL-SHIFT-F12 Moves to the next task in the TaskList window.
View.PopBrowseContext CTRL-SHIFT-8 Moves backward in the browse history. Available in the object browser or Class View window.
View.ViewCode F7 Switches from a design view to a code view in the editor.
View.ViewDesigner SHIFT-F7 Switches from a code view to a design view in the editor.
View.WebNavigateBack ALT-LEFT ARROW Goes back in the web browser history.
View.WebNavigateForward ALT-RIGHT ARROW Goes forward in the web browser history.
 
Table C-2. Project-related
 
Command Shortcut Description
Build.BuildSolution CTRL-SHIFT-B Builds the solution.
Build.Compile CTRL-F7 Compiles the selected file. C++ projects only—.NET projects do not support compilation of individual files, only whole projects.
File.AddExistingItem SHIFT-ALT-A Displays the Add Existing Item dialog.
File.AddNewItem CTRL-SHIFT-A Displays the Add New Item dialog.
File.BuildandBrowse CTRL-F8 Builds the current project and then displays the start page for the project in the browser. Available only for web projects.
File.NewFile CTRL-N Displays the New File dialog. Files created in this way are not associated with any project. Use File.AddNewItem (Ctrl-Shift-A) to create a new file in a project.
File.NewProject CTRL-SHIFT-N Displays the New Project dialog.
File.OpenFile CTRL-O Displays the Open File dialog.
File.OpenProject CTRL-SHIFT-O Displays the Open Project dialog.
Project.Override CTRL-ALT-INSERT Allows you to override base class methods in a derived class when an overridable method is highlighted in the Class View pane.
 
Table C-3. Window manipulation
 
Command Shortcut Description
View.FullScreen SHIFT-ALT-ENTER Toggles full screen mode.
View.NavigateBackward CTRL-+ Goes back to the previous location in the navigation history. (For example, if you press Ctrl-Home to go to the start of a document, this shortcut will take the cursor back to wherever it was before you pressed Ctrl-Home.)
View.NavigateForward CTRL-SHIFT-+ Moves forward in the navigation history. This is effectively an undo for the View.NavigateBackward operation.
Window.ActivateDocumentWindow ESC Closes a menu or dialog, cancels an operation in progress, or places focus in the current document window.
Window.CloseDocumentWindow CTRL-F4 Closes the current MDI child window.
Window.CloseToolWindow SHIFT-ESC Closes the current tool window.
Window.MoveToDropDownBar CTRL-F2 Moves the cursor to the navigation bar at the top of a code view.
Window.NextDocumentWindow CTRL-TAB Cycles through the MDI child windows one window at a time.
CTRL-F6
Window.PreviousDocumentWindow CTRL-SHIFT-TAB Moves to the previous MDI child window.
CTRL-SHIFT-F6
Window.NextPane ALT-F6 Moves to the next tool window.
Window.PreviousPane SHIFT-ALT-F6 Moves to the previously selected window.
Window.NextSplitPane F6 Moves to the next pane of a split pane view of a single document.
Window.PreviousSplitPane SHIFT-F6 Moves to the previous pane of a document in split pane view.
Window.NextTab CTRL-PAGEDOWN Moves to the next tab in the document or window (e.g., you can use this to switch the HTML editor from its design view to its HTML view.
Window.PreviousTab CTRL-PAGE UP Moves to the previous tab in the document or window.
 
Table C-4. Text navigation
 
Command Shortcut Description
Edit.CharLeft LEFT ARROW Moves the cursor one character to the left.
Edit.CharRight RIGHT ARROW Moves the cursor one character to the right.
Edit.DocumentEnd CTRL-END Moves the cursor to the end of the document.
Edit.DocumentStart CTRL-HOME Moves the cursor to the start of the document.
Edit.GoTo CTRL-G Displays the Go to Line dialog. If the debugger is running, the dialog also lets you specify addresses or function names to go to.
Edit.GoToBrace CTRL-] Moves the cursor to the matching brace in the document. If the cursor is on an opening brace, this will move to the corresponding closing brace and vice versa.
Edit.LineDown DOWN ARROW Moves the cursor down one line.
Edit.LineEnd END Moves the cursor to the end of the current line.
Edit.LineStart HOME Moves the cursor to the beginning of the line. If you press Home when the cursor is already at the start of the line, it will toggle the cursor between the first non-whitespace character and the real start of the line.
Edit.LineUp UP ARROW Moves the cursor up one line.
Edit.NextBookmark CTRL-K, CTRL-N Moves to the next bookmark in the document.
Edit.PageDown PAGE DOWN Scrolls down one screen in the editor window.
Edit.PageUp PAGE UP Scrolls up one screen in the editor window.
Edit.PreviousBookmark CTRL-K, CTRL-P Moves to the previous bookmark.
Edit.QuickInfo CTRL-K, CTRL-I Displays Quick Info, based on the current language.
Edit.ScrollLineDown CTRL-DOWN ARROW Scrolls text down one line but does not move the cursor. This is useful for scrolling more text into view without losing your place. Available only in text editors.
Edit.ScrollLineUp CTRL-UP ARROW Scrolls text up one line but does not move the cursor. Available only in text editors.
Edit.WordNext CTRL-RIGHT ARROW Moves the cursor one word to the right.
Edit.WordPrevious CTRL-LEFT ARROW Moves the cursor one word to the left.
View.BrowseNext CTRL-SHIFT-1 Navigates to the next definition, declaration, or reference of an item. Available in the object browser and Class View window. Also available in source editing windows if you have already used the Edit.GoToReference (Shift-F12) shortcut.
View.BrowsePrevious CTRL-SHIFT-2 Navigates to the previous definition, declaration, or reference of an item.
 
Table C-5. Text manipulation
 
Command Shortcut Description
Edit.BreakLine ENTER Inserts a new line.
SHIFT-ENTER
Edit.CharTranspose CTRL-T Swaps the characters on either side of the cursor. (For example, AC|BD becomes AB|CD.) Available only in text editors.
Edit.ClearBookmarks CTRL-K, CTRL-L Removes all unnamed bookmarks in the current document.
Edit.CollapseToDefinitions CTRL-M, CTRL-O Automatically determines logical boundaries for creating regions in code, such as procedures, and then hides them. This collapses all such regions in the current document.
Edit.CommentSelection CTRL-K, CTRL-C Marks the current line or selected lines of code as a comment, using the correct comment syntax for the programming language.
Edit.CompleteWord ALT-RIGHT ARROW Displays statement completion based on the current language or autocompletes word if existing text unambiguously identifies a single symbol.
CTRL-SPACEBAR
Edit.Delete DELETE Deletes one character to the right of the cursor.
Edit.DeleteBackwards BACKSPACE Deletes one character to the left of the cursor.
SHIFT-BACKSPACE
Edit.DeleteHorizontalWhitespace CTRL-K, CTRL-\ Removes horizontal whitespace in the selection or deletes whitespace adjacent to the cursor if there is no selection.
Edit.FormatDocument CTRL-K, CTRL-D Applies the indenting and space formatting for the language as specified on the Formatting pane of the language in the Text Editor section of the Options dialog to the document. This shortcut is available only in VB.NET—in other languages you must first select the whole document with Ctrl-A and then format the selection with Ctrl-K, Ctrl-F.
Edit.FormatSelection CTRL-K, CTRL-F Applies the indenting and space formatting for the language as specified on the Formatting pane of the language in the Text Editor section of the Options dialog to the selected text.
Edit.HideSelection CTRL-M, CTRL-H Hides the selected text. A signal icon marks the location of the hidden text in the file. VB.NET only.
Edit.InsertTab TAB Indents the currently selected line or lines by one tab stop. If there is no selection, this inserts a tab stop.
Edit.LineCut CTRL-L Cuts all selected lines or the current line if nothing has been selected to the clipboard.
Edit.LineDelete CTRL-SHIFT-L Deletes all selected lines or the current line if no selection has been made.
Edit.LineOpenAbove CTRL-ENTER Inserts a blank line above the cursor.
Edit.LineOpenBelow CTRL-SHIFT-ENTER Inserts a blank line below the cursor.
Edit.LineTranspose SHIFT-ALT-T Moves the line containing the cursor below the next line.
Edit.ListMembers CTRL-J Lists members for statement completion when editing code.
Edit.MakeLowercase CTRL-U Changes the selected text to lowercase characters.
Edit.MakeUppercase CTRL-SHIFT-U Changes the selected text to uppercase characters.
Edit.OverTypeMode INSERT Toggles between insert and overtype insertion modes.
Edit.ParameterInfo CTRL-SHIFT-SPACEBAR Displays a tooltip that contains information for the current parameter, based on the current language.
Edit.StopHidingCurrent CTRL-M, CTRL-U Removes the outlining information for the currently selected region.
Edit.StopOutlining CTRL-M, CTRL-P Removes all outlining information from the entire document.
Edit.SwapAnchor CTRL-R, CTRL-P Swaps the anchor and endpoint of the current selection.
Edit.TabLeft SHIFT-TAB Moves current line or selected lines one tab stop to the left.
Edit.ToggleAllOutlining CTRL-M, CTRL-L Toggles all previously marked hidden text sections between hidden and display states.
Edit.ToggleBookmark CTRL-K, CTRL-K Sets or removes a bookmark at the current line.
Edit.ToggleOutliningExpansion CTRL-M, CTRL-M Toggles the currently selected hidden text section or the section containing the cursor if there is no selection between the hidden and display states.
Edit.ToggleTaskListShortcut CTRL-K, CTRL-H Sets or removes a shortcut in the tasklist to the current line.
Edit.ToggleWordWrap CTRL-R, CTRL-R Enables or disables word wrap in an editor.
Edit.UncommentSelection CTRL-K, CTRL-U Removes the comment syntax from the current line or currently selected lines of code.
Edit.ViewWhiteSpace CTRL-R, CTRL-W Shows or hides spaces and tab marks.
Edit.WordDeleteToEnd CTRL-DELETE Deletes the word to the right of the cursor.
Edit.WordDeleteToStart CTRL-BACKSPACE Deletes the word to the left of the cursor.
Edit.WordTranspose CTRL-SHIFT-T Transposes the two words that follow the cursor. (For example, |End Sub would be changed to read Sub End|.)
 
Table C-6. Text selection
 
Command Shortcut Description
Edit.CharLeftExtend SHIFT-LEFT ARROW Moves the cursor to the left one character, extending the selection.
Edit.CharLeftExtendColumn SHIFT-ALT-LEFT ARROW Moves the cursor to the left one character, extending the column selection.
Edit.CharRightExtend SHIFT-RIGHT ARROW Moves the cursor to the right one character, extending the selection.
Edit.CharRightExtendColumn SHIFT-ALT-RIGHT ARROW Moves the cursor to the right one character, extending the column selection.
Edit.DocumentEndExtend CTRL-SHIFT-END Moves the cursor to the end of the document, extending the selection.
Edit.DocumentStartExtend CTRL-SHIFT-HOME Moves the cursor to the start of the document, extending the selection.
Edit.GoToBraceExtend CTRL-SHIFT-] Moves the cursor to the next brace, extending the selection.
Edit.LineDownExtend SHIFT-DOWN ARROW Moves the cursor down one line, extending the selection.
Edit.LineDownExtendColumn SHIFT-ALT-DOWN ARROW Moves the cursor down one line, extending the column selection.
Edit.LineEndExtend SHIFT-END Moves the cursor to the end of the current line, extending the selection.
Edit.LineEndExtendColumn SHIFT-ALT-END Moves the cursor to the end of the line, extending the column selection.
Edit.LineStartExtend SHIFT-HOME Moves the cursor to the start of the line, extending the selection.
Edit.LineStartExtendColumn SHIFT-ALT-HOME Moves the cursor to the start of the line, extending the column selection.
Edit.LineUpExtend SHIFT-UP ARROW Moves the cursor up one line, extending the selection.
Edit.LineUpExtendColumn SHIFT-ALT-UP ARROW Moves the cursor up one line, extending the column selection.
Edit.PageDownExtend SHIFT-PAGE DOWN Extends selection down one page.
Edit.PageUpExtend SHIFT-PAGE UP Extends selection up one page.
Edit.SelectAll CTRL-A Selects everything in the current document.
Edit.SelectCurrentWord CTRL-W Selects the word containing the cursor or the word to the right of the cursor.
Edit.SelectToLastGoBack CTRL-= Selects from the current location in the editor back to the previous location in the navigation history.
Edit.ViewBottomExtend CTRL-SHIFT-PAGE DOWN Moves the cursor to the last line in view, extending the selection.
Edit.ViewTopExtend CTRL-SHIFT-PAGE UP Moves the cursor to the top of the current window, extending the selection.
Edit.WordNextExtend CTRL-SHIFT-RIGHT ARROW Moves the cursor one word to the right, extending the selection.
Edit.WordNextExtendColumn CTRL-SHIFT-ALT-RIGHT ARROW Moves the cursor to the right one word, extending the column selection.
Edit.WordPreviousExtend CTRL-SHIFT-LEFT ARROW Moves the cursor one word to the left, extending the selection.
Edit.WordPreviousExtendColumn CTRL-SHIFT-ALT-LEFT ARROW Moves the cursor to the left one word, extending the column selection.
 
Table C-7. Control editor (designer)
 
Command Shortcut Description
Edit.MoveControlDown CTRL-DOWN ARROW Moves the selected control down in increments of one on the design surface.
Edit.MoveControlDownGrid DOWN ARROW Moves the selected control down to the next grid position on the design surface.
Edit.MoveControlLeft CTRL-LEFT ARROW Moves the control to the left in increments of one on the design surface.
Edit.MoveControlLeftGrid LEFT ARROW Moves the control to the left to the next grid position on the design surface.
Edit.MoveControlRight CTRL-RIGHT ARROW Moves the control to the right in increments of one on the design surface.
Edit.MoveControlRightGrid RIGHT ARROW Moves the control to the right into the next grid position on the design surface.
Edit.MoveControlUp CTRL-UP ARROW Moves the control up in increments of one on the design surface.
Edit.MoveControlUpGrid UP ARROW Moves the control up into the next grid position on the design surface.
Edit.SelectNextControl TAB Moves to the next control in the tab order.
Edit.SelectPreviousControl SHIFT-TAB Moves to the previous control in the tab order.
Edit.SizeControlDown CTRL-SHIFT-DOWN ARROW Increases the height of the control in increments of one on the design surface.
Edit.SizeControlDownGrid SHIFT-DOWN ARROW Increases the height of the control to the next grid position on the design surface.
Edit.SizeControlLeft CTRL-SHIFT-LEFT ARROW Reduces the width of the control in increments of one on the design surface.
Edit.SizeControlLeftGrid SHIFT-LEFT ARROW Reduces the width of the control to the next grid position on the design surface.
Edit.SizeControlRight CTRL-SHIFT-RIGHT ARROW Increases the width of the control in increments of one on the design surface.
Edit.SizeControlRightGrid SHIFT-LEFT ARROW Increases the width of the control to the next grid position on the design surface.
Edit.SizeControlUp CTRL-SHIFT-UP ARROW Decreases the height of the control in increments of one on the design surface.
Edit.SizeControlUpGrid SHIFT-UP ARROW Decreases the height of the control to the next grid position on the design surface.
 
Table C-8. Search and replace
 
Command Shortcut Description
Edit.Find CTRL-F Displays the Find dialog.
Edit.FindInFiles CTRL-SHIFT-F Displays the Find in Files dialog.
Edit.FindNext F3 Finds the next occurrence of the previous search text.
Edit.FindNextSelected CTRL-F3 Finds the next occurrence of the currently selected text or the word under the cursor if there is no selection.
Edit.FindPrevious SHIFT-F3 Finds the previous occurrence of the search text.
Edit.FindPreviousSelected CTRL-SHIFT-F3 Finds the previous occurrence of the currently selected text or the word under the cursor.
Edit.GoToFindCombo CTRL-D Places the cursor in the Find/Command line on the Standard toolbar.
Edit.HiddenText ALT-F3, H Selects or clears the Search Hidden Text option for the Find dialog.
Edit.IncrementalSearch CTRL-I Starts an incremental search—after pressing Ctrl-I, you can type in text, and for each letter you type, VS.NET will find the first occurrence of the sequence of letters you have typed so far. This is a very convenient facility, as it lets you find text by typing in exactly as many characters as are required to locate the text and no more.
If you press Ctrl-I a second time without typing any characters, it recalls the previous pattern. If you press it a third time or you press it when an incremental search has already found a match, VS.NET searches for the next occurrence.
Edit.MatchCase ALT-F3, C. Selects or clears the Match Case option for Find and Replace operations.
Edit.RegularExpression ALT-F3, R Selects or clears the Regular Expression option so that special characters can be used in Find and Replace operations.
Edit.Replace CTRL-H Displays the Replace dialog.
Edit.ReplaceInFiles CTRL-SHIFT-H Displays the Replace in Files dialog.
Edit.ReverseIncrementalSearch CTRL-SHIFT-I Performs an incremental search in reverse direction.
Edit.StopSearch ALT-F3, S Halts the current Find in Files operation.
Edit.Up ALT-F3, B Selects or clears the Search Up option for Find and Replace operations.
Edit.WholeWord ALT-F3, W Selects or clears the Match Whole Word option for Find and Replace operations.
Edit.Wildcard ALT-F3, P Selects or clears the Wildcard option for Find and Replace operations.
 
Table C-9. Help
 
Command Shortcut Description
Help.Contents CTRL-ALT-F1 Displays the Contents window for the documentation.
Help.DynamicHelp CTRL-F1 Displays the Dynamic Help window, which displays different topics depending on what items currently have focus. If the focus is in a source window, the Dynamic Help window will display help topics that are relevant to the text under the cursor.
Help.F1Help F1 Displays a topic from Help that corresponds to the part of the user interface that currently has the focus. If the focus is in a source window, Help will try to display a topic relevant to the text under the cursor.
Help.Index CTRL-ALT-F2 Displays the Help Index window.
Help.Indexresults SHIFT-ALT-F2 Displays the Index Results window, which lists the topics that contain the keyword selected in the Index window.
Help.NextTopic ALT-DOWN ARROW Displays the next topic in the table of contents. Available only in the Help browser window.
Help.PreviousTopic ALT-UP ARROW Displays the previous topic in the table of contents. Available only in the Help browser window.
Help.Search CTRL-ALT-F3 Displays the Search window, which allows you to search for words or phrases in the documentation.
Help.Searchresults SHIFT-ALT-F3 Displays the Search Results window, which displays a list of topics that contain the string searched for from the Search window.
Help.WindowHelp SHIFT-F1 Displays a topic from Help that corresponds to the user interface item that has the focus.
 
Table C-10. Debugging
 
Command Shortcut Description
Debug.ApplyCodeChanges ALT-F10 Starts an edit and continue build to apply changes to code being debugged. Edit and continue is available only in C++ projects.
Debug.Autos CTRL-ALT-V, A Displays the Auto window to view the values of variables currently in the scope of the current line of execution within the current procedure.
Debug.BreakAll CTRL-ALT-Break Temporarily stops execution of all processes in a debugging session. Available only in run mode.
Debug.Breakpoints CTRL-ALT-B Displays the Breakpoints dialog, where you can add and modify breakpoints.
Debug.CallStack CTRL-ALT-C Displays the Call Stack window to display a list of all active procedures or stack frames for the current thread of execution. Available only in break mode.
Debug.ClearAllBreakpoints CTRL-SHIFT-F9 Clears all of the breakpoints in the project.
Debug.Disassembly CTRL-ALT-D Displays the Disassembly window.
Debug.EnableBreakpoint CTRL-F9 Enables or disables the breakpoint on the current line of code. The line must already have a breakpoint for this to work.
Debug.Exceptions CTRL-ALT-E Displays the Exceptions dialog.
Debug.Immediate CTRL-ALT-I Displays the Immediate window, where you can evaluate expressions and execute individual commands.
Debug.Locals CTRL-ALT-V, L Displays the Locals window to view the variables and their values for the currently selected procedure in the stack frame.
Debug.Memory1 CTRL-ALT-M, 1 Displays the Memory 1 window to view memory in the process being debugged. This is particularly useful when you do not have debugging symbols available for the code you are looking at. It is also helpful for looking at large buffers, strings, and other data that does not display clearly in the Watch or Variables window.
Debug.Memory2 CTRL-ALT-M, 2 Displays the Memory 2 window.
Debug.Memory3 CTRL-ALT-M, 3 Displays the Memory 3 window.
Debug.Memory4 CTRL-ALT-M, 4 Displays the Memory 4 window.
Debug.Modules CTRL-ALT-U Displays the Modules window, which allows you to view the .dll or .exe files loaded by the program. In multiprocess debugging, you can right-click and select Show Modules for all programs.
Debug.NewBreakpoint CTRL-B Opens the New Breakpoint dialog.
Debug.QuickWatch CTRL-ALT-Q Displays the Quick Watch dialog with the current value of the selected expression. Available only in break mode. Use this command to check the current value of a variable, property, or other expression for which you have not defined a watch expression.
Debug.Registers CTRL-ALT-G Displays the Registers window, which displays CPU register contents.
Debug.Restart CTRL-SHIFT-F5 Terminates the current debugging session, rebuilds if necessary, and then starts a new debugging session. Available in break and run modes.
Debug.RunningDocuments CTRL-ALT-N Displays the Running Documents window that displays the set of HTML documents that you are in the process of debugging. Available in break and run modes.
Debug.RunToCursor CTRL-F10 Starts or resumes execution of your code and then halts execution when it reaches the selected statement. This starts the debugger if it is not already running.
Debug.SetNextStatement CTRL-SHIFT-F10 Sets the execution point to the line of code you choose.
Debug.ShowNextStatement ALT-NUM * Highlights the next statement to be executed.
Debug.Start F5 If not currently debugging, this runs the startup project or projects and attaches the debugger. If in break mode, this allows execution to continue (i.e., it returns to run mode).
Debug.StartWithoutDebugging CTRL-F5 Runs the code without invoking the debugger. For console applications, this also arranges for the console window to stay open with a "Press any key to continue" prompt when the program finishes.
Debug.StepInto F11 Executes code one statement at a time, tracing execution into function calls.
Debug.StepOut SHIFT-F11 Executes the remaining lines of a function in which the current execution point lies.
Debug.StepOver F10 Executes the next line of code but does not step into any function calls.
Debug.StopDebugging SHIFT-F5 Available in break and run modes, this terminates the debugging session.
Debug.This CTRL-ALT-V, T Displays the This window, which allows you to view the data members of the object associated with the current method.
Debug.Threads CTRL-ALT-H Displays the Threads window to view all of the threads for the current process.
Debug.ToggleBreakpoint F9 Sets or removes a breakpoint at the current line.
Debug.ToggleDisassembly CTRL-F11 Displays the disassembly information for the current source file. Available only in break mode.
Debug.Watch1 CTRL-ALT-W, 1 Displays the Watch 1 window to view the values of variables or watch expressions.
Debug.Watch2 CTRL-ALT-W, 2 Displays the Watch 2 window.
Debug.Watch3 CTRL-ALT-W, 3 Displays the Watch 3 window.
Debug.Watch4 CTRL-ALT-W, 4 Displays the Watch 4 window.
Tools.DebugProcesses CTRL-ALT-P Displays the Processes dialog, which allows you to attach or detach the debugger to one or more running processes.
 
Table C-11. Object browser
 
Command Shortcut Description
Edit.FindSymbol ALT-F12 Displays the Find Symbol dialog.
Edit.GoToDeclaration CTRL-F12 Displays the declaration of the selected symbol in the code.
Edit.GoToDefinition F12 Displays the definition for the selected symbol in code.
View.FindSymbolResults CTRL-ALT-F12 Displays the Find Symbol Results window.
View.ObjectBrowser CTRL-ALT-J Displays the Object Browser to view the classes, properties, methods, events, and constants defined either in your project or by components and type libraries referenced by your project.
View.ObjectBrowserBack ALT-+ Moves back to the previously selected object in the selection history of the object browser.
View.ObjectBrowserForward SHIFT-ALT-+ Moves forward to the next object in the selection history of the object browser.
 
Table C-12. Tool window
 
Command Shortcut Description
Tools.CommandWindowMarkMode CTRL-SHIFT-M Toggles the Command window into or out of a mode allowing text within the window to be selected.
View.ClassView CTRL-SHIFT-C Displays the Class View window.
View.CommandWindow CTRL-ALT-A Displays the Command window, which allows you to type commands that manipulate the IDE.
View.DocumentOutline CTRL-ALT-T Displays the Document Outline window to view the flat or hierarchical outline of the current document.
View.Favorites CTRL-ALT-F Displays the Favorites window, which lists shortcuts to web pages.
View.Output CTRL-ALT-O Displays the Output window to view status messages at runtime.
View.PropertiesWindow F4 Displays the Properties window, which lists the design-time properties and events for the currently selected item.
View.PropertyPages SHIFT-F4 Displays the property pages for the item currently selected. (For example, use this to show a project's settings.)
View.ResourceView CTRL-SHIFT-E Displays the Resource View window.
View.ServerExplorer CTRL-ALT-S Displays the Server Explorer window, which allows you to view and manipulate database servers, event logs, message queues, web services, and many other operating system services.
View.ShowWebBrowser CTRL-ALT-R Displays the web browser window, which allows you to view pages on the Internet.
View.SolutionExplorer CTRL-ALT-L Displays the Solution Explorer, which lists the projects and files in the current solution.
View.TaskList CTRL-ALT-K Displays the TaskList window, which displays tasks, comments, shortcuts, warnings, and error messages.
View.Toolbox CTRL-ALT-X Displays the Toolbox, which contains controls and other items that can be dragged into editor and designer windows.
 
Table C-13. HTML Design view
 
Command Shortcut Description
Format.Bold CTRL-B Toggles the selected text between bold and normal.
Format.DecreaseIndent CTRL-SHIFT-T Decreases the selected paragraph by one indent unit.
Format.IncreaseIndent CTRL-T Indents the selected paragraph by one indent unit.
Format.Italic CTRL-I Toggles the selected text between italic and normal.
Format.LockElement CTRL-SHIFT-K Prevents an absolutely positioned element from being inadvertently moved. If the element is already locked, this unlocks it.
Format.ShowGrid CTRL-G Toggles the grid.
Format.SnapToGrid CTRL-SHIFT-G Specifies that elements be aligned using an invisible grid. You can set grid spacing on the Design pane of HTML designer options in the Options dialog, and the grid will be changed the next time you open a document.
Format.Underline CTRL-U Toggles the selected text between underlined and normal.
Insert.Bookmark CTRL-SHIFT-L Displays the Bookmark dialog.
Insert.DIV CTRL-J Inserts <div></div> in the current HTML document.
Insert.Hyperlink CTRL-L When text is selected, displays the Hyperlink dialog.
Insert.Image CTRL-SHIFT-W Displays the Insert Image dialog.
Table.InsertRowAbove CTRL-ALT-UP ARROW Adds one row above the current row in the table.
Table.InsertRowBelow CTRL-ALT-DOWN ARROW Adds one row below the current row in the table.
Table.InsertColumnstotheLeft CTRL-ALT-LEFT ARROW Adds one column to the left of the current column in the table.
Table.InsertColumnstotheRight CTRL-ALT-RIGHT ARROW Adds one column to the right of the current column in the table.
View.Details CTRL-SHIFT-Q Toggles display of marker icons for HTML elements that do not have a visual representation, such as comments, scripts, and anchors for absolutely positioned elements.
View.NextView CTRL-PAGE DOWN Switches from design view to HTML view and vice versa.
View.VisibleBorders CTRL-Q Displays a 1-pixel border around HTML elements that support a BORDER attribute and have it set to zero, such as tables, table cells, and divisions.
 
Table C-14. Macro
 
Command Shortcut Description
View.MacroExplorer ALT-F8 Displays the Macro Explorer window, which lists all available macros.
Tools.MacrosIDE ALT-F11 Launches the macros IDE.
Tools.RecordTemporaryMacro CTRL-SHIFT-R Places the environment in macro record mode or completes recording if already in record mode.
Tools.RunTemporaryMacro CTRL-SHIFT-P Plays back a recorded macro.
 
Table C-15. Dialog resource editor (but not the Windows Forms dialog Editor)
 
Command Shortcut Description
Format.AlignBottoms CTRL-SHIFT-DOWN ARROW Aligns the bottom edges of the selected controls with the dominant control. The dominant control is the last one to be selected.
Format.AlignCenters SHIFT-F9 Aligns the vertical centers of the selected controls with the dominant control.
Format.AlignLefts CTRL-SHIFT-LEFT ARROW Aligns the left edges of the selected controls with the dominant control.
Format.AlignMiddles F9 Aligns the horizontal centers of the selected controls with the dominant control.
Format.AlignRights CTRL-SHIFT-RIGHT ARROW Aligns the right edges of the selected controls with the dominant control.
Format.AlignTops CTRL-SHIFT-UP ARROW Aligns the top edges of the selected controls with the dominant control.
Format.ButtonBottom CTRL-B Places the selected buttons along the bottom center of the dialog.
Format.ButtonRight CTRL-R Places the selected buttons in the top-right corner of the dialog.
Format.CenterHorizontal CTRL-SHIFT-F9 Centers the controls horizontally within the dialog.
Format.CenterVertical CTRL-F9 Centers the controls vertically within the dialog.
Format.CheckMnemonics CTRL-M Checks uniqueness of accelerator mnemonics. If you have the same accelerator key assigned to two different controls, this will warn you of the problem.
Format.SizeToContent SHIFT-F7 Resizes the selected control(s) to fit the caption text.
Format.SpaceAcross ALT-LEFT ARROW Evenly spaces the selected controls horizontally.
Format.SpaceDown ALT-DOWN ARROW Evenly spaces the selected controls vertically.
Format.TabOrder CTRL-D Sets the order of controls within the dialog.
Format.TestDialog CTRL-T Displays the dialog to allow you to check its appearance and behavior.
Format.ToggleGuides CTRL-G Cycles between no grid, guidelines, and grid for dialog editing.
 
Table C-16. Accelerator and string resource editor
 
Command Shortcut Description
Edit.NewAccelerator INSERT Adds a new entry for an accelerator key. Available only in the accelerator editor.
Edit.NewString INSERT Adds a new entry in the string table. Available only in the string editor.
Posted by 나비:D
:

출처 : http://eslife.tistory.com/entry/안전하고-좋은-냄새가-나는-C-코드-만들기

C++
을 배운지 꽤 오래 되었지만, 아직도 코드 리뷰를 통해 다른 개발자들의 코드를 볼 때면 한숨이 나오는 경우가 많습니다.

이런 경우가 반복되다 보니, 예전에 몇 가지 코딩 규칙 비슷하게 만들어놓은 자료가 있어 포스팅해 봅니다.  자료가 만들다 말아 내용이 중구난방이네요..  앞으로도 계속 내용 보강해 나가겠습니다.

 

    포인트 핸들 및 윈도우 핸들 체크

-       함수로 전달된 포인터 인자나, new 로 생성한 포인터 등 모든 포인터는 사용하기 직전 포인터 검사를 수행

-       가급적 STL 컨테이너를 사용해서 아예 포인터를 사용하지 않는 것이 정신건강에 이롭다. (STL 자체적으로 메모리 생성 및 소멸)

-       메모리 LEAK 을 막기 위해 SMART POINT 와 같은 Wrapper 클래스를 만든다.

-       (윈도우 프로그램의 경우)윈도우 API 호출 직전 항상 윈도우 핸들이 정상인지 IsWindow 와 같은 함수로 검사한다.

 

    DRY(Don't Repeat Your Code)원칙

-       같은 코드를 여기 저기 중복해서 사용하지 말아야 한다. (☞ 실용주의 프로그래머 참고). 중복해서 사용할 경우 코드 량이 늘어날 뿐만 아니라 유지보수 cost 가 같이 늘어 나고, 추후 추가/개선/변경 등의 요구사항으로 인한 모듈 수정 시 여러 소스를 함께 수정해야 한다.

-       동일한 코드를 공용 루틴(함수)으로 개발 – 2~3줄 짜리 복잡한 if 문도 bool 를 리턴 하는 함수로 개발(Refactoring 참고)

 

    클래스간 종속성 최소화

-       대규모 프로젝트에서는 공통모듈이 변경되어도 이를 사용하는 모듈이 문제가 없도록 반드시 공통모듈은 인터페이스 기반(데이터가 없는, virtual 가상함수로만 구성된)으로 구현한다. (The C++ Programming Language 참고)

-       A 클래스 → B 클래스 → C 클래스를 사용할 경우 각 클래스는 자기가 직접 다루는 클래스(A B, B C) 만 알아야 한다. A 클래스는 C 클래스를 직/간접적으로 include 해서는 안되며 C 클래스의 변경으로 인해 A 클래스가 컴파일 되어서는 안 된다. A 클래스가 C 를 직접 접근할 경우가 있다면 B 클래스에 위임함수를 만들어 해결한다. (☞ 실용주의 프로그래머 참고)

-       B 클래스가 A 클래스로 어떤 데이터를 전달할 경우가 있다면(주로 이벤트 발생시 값을 전달하기 위해) A 클래스의 최소 인터페이스만을 B 클래스에 전달하여(COM 의 이벤트 소스 방식) 종속성을 최소화 한다. (Developer’s Workshop To COM and  ATL 3.0 참고)

 

    함수 인자 전달

-       함수의 인자는 최대 7개를 넘지 않아야 한다(Code Complete 2 참고)

-       클래스 인스턴스를 함수 인자로 넘겨서는 안 된다(특히 함수 인자로 CString 을 넘기는 경우가 많음. CString → const CString& CString*, const char* 등으로 수정한다. )

 

    오류조건을 먼저 검사하여 오류 체크로 인해 코드 가독성이 떨어지지 않도록 하자.

-       특정 오류조건이 발생하면 더 이상 함수 수행에 의미 없을 경우, 이러한 오류 조건들은 함수초입단계부터 먼저 확인해서 바로 리턴 한다

-       위와 같이 오류조건이 먼저 확인되면 프로그램 코드에서 if depth 가 줄어 들고 코드 읽기가 수월해 지는 장점이 있다.

Before

After

void CClass::OnTest()

{

 ...

 ...

 if (m_pWndMain)

 { 

  DoSomething1();

 }

 ...

 if (m_pWndMain)

 { 

  DoSomething2();

 }

 

}

void CClass::OnTest()

{

 if (m_pWndMain == NULL)

  return;

 ...

 ...

 DoSomething1();

 ...

 DoSomething2();

 

}

 

    긴 함수 쪼개기 (Refactoring 참고)

-       긴 함수는 작은 여러 개의 함수로 쪼갠다(Refactoring 책에 의하면 2-3줄 짜리 함수로까지 쪼개어서 코드 가독성을 높이도록 하고 있음)

-       작은 함수로 쪼개다 보면, 작은 함수를 재활용하게 될 수 있고

-       긴 함수보다 코드 읽기가 수월해 지며

-       결국 유지보수가 쉬워진다

 

    enum 값 선언 시 _START, _END 를 활용하자( CODE COMPLETE2 참고)

-       enum 으로 선언된 값들을 변수나 for loop 를 이용하여 반복 계산할 경우가 종종 있는데 이 경우 enum 시작과, 끝을 나타내는 값을 enum 선언에 포함하면 유용하게 사용할 수 있다.

-       추후 enum 에 값을 추가해야 할 경우 _END 값을 사용한 배열은 코드 변경없이 크기가 늘어남

-       For 루프 등에 _START, _END 을 사용할 수 있어 유지 보수에 유리

Before

After

enum WEEK_NAME

{

           SUNDAY                     = 0,

           MONDAY                    = 1,

           TUESDAY                    = 2,

           WEDNESDAY     = 3,

           THURSDAY       = 4,

           FRIDAY            = 5,

           SATERDAY        = 6,

};

 

int nWeeks[SATERDAY + 1];

}

enum WEEK_NAME

{

           WEEK_STAR       = 0,

           SUNDAY                     = 0,

           MONDAY                    = 1,

           TUESDAY                    = 2,

           WEDNESDAY     = 3,

           THURSDAY       = 4,

           FRIDAY            = 5,

           SATERDAY        = 6,

           WEEK_END        = 6,

};

 

int nWeeks[WEEK_END + 1];

 

 

    복잡한 제어문을 가진 루틴을 피하자  

-       If 문은 2 depth 이상 들어 갈 경우 refactoring 하라 (CODE COMPLETE2)

     대부분 코드를 제대로 이해하지 못해 복잡한 코드를 작성하고 있다.

     개발자 90% 2 depth 이상 들어가는 if 문장을 이해하지 못한다

-       IF~ELSE IF ~ELSE IF ~ …. ELSE 가 길게 이어질 경우 SWITCH 문으로 바꾼다

-       IF 문이 길게 늘어 질 경우 함수로 분리한다

-       C++ factory 개념으로 상속을 이용한 클래스를 만드는 방법도 활용

Posted by 나비:D
:

출처 : http://cafe.naver.com/flexcomponent/911

1. 디자이너는 설계 문서를 바탕으로 화면 레이아웃을 잡고 개발자에게 넘겨준다. (전체 틀)

2. 개발자는 mxml을 사용해서 레이아웃을 구현하고 기능을 구현한다. (mxml과 이벤트 처리 및 데이터 처리)

단, 아키텍처에 따라 하위 어플리케이션에 대한 레이아웃을 일관성 있게 가져갈 수 있도록 고려해야 한다.

3. 디자이너는 기본 레이아웃에 기반한 모든 화면에서 공통 사용할 부분에 대해 정리하고 개발자에게 넘겨준다. (문자크기, 정렬, 색 등등)

4. 개발자는 최종 디자인을 mxml에 적용한다.

5. 디자이너는 아웃풋을 보고 검토한다.

6. 개발자는 검토시 나온 수정사항들을 반영한다.

7. 디자이너는 각 화면별 상세 디자인을 하고 개발자는 계속해서 적용해 나간다.

===========================================================

위 과정에서 mxml 구현은 시간이 지날수록 디자이너 몫이 되야 하고, 스킨 및 스타일, 이펙트, 테마 등을 적용할 수 있어야 한다.

물론, DisplayObject를 사용하여 드로잉이 가능해야 하고 프로그램적인 관점에서 재사용 가능한 모듈 정도는 디자이너가

구현할 수 있어야 한다.

실제 런던에 유명한 모 대학교에서는 디자인 전공자들에게 Java 언어가 필수과목으로 지정되어 있다.

그것은 디자이너도 기본적으로 프로그램적인 마인드를 가지고 있어야 한다는 말을 하는 것이다.

디자이너가 할일과 프로그래머가 할일은 명확히 구분되어야 한다.

그래야 퀄리티 부분에서 뛰어날 수 있다.

Posted by 나비:D
:

응용 프로그램을 위한 최상의 사용자 환경을 만드는 방법

Dax Pandhi
Nukeation Studios

2006년 4월

요약: Dax Pandhi는 Windows 응용 프로그램을 위한 사용이 쉬운 사용자 인터페이스를 구현하는 방법과 사용자 환경 디자인 원칙에 대해 설명합니다.

목차

소개
적절한 UI를 만들기 위한 기본 원칙
간격 조정 및 위치 지정
크기
그룹화
사용 편이성
보다 효율적이고 편리한 사용자 환경 조성을 위한 20가지 팁
1. 표준 준수
2. 중요 단추에 주의 끌기
3. 알아보기 쉽도록 아이콘 제공
4. 알아보기 쉽도록 머리글 작성
5. 사용자 지정 메시지 상자 사용
6. 대체 명령 포함
7. 중요 작업을 처리하는 방법
8. 라디오 단추 또는 콤보 상자
9. 사용자를 방해하지 마십시오
10. 진행 상태 알리기
11. 마법사로 복잡한 단계를 간단히 수행
12. 텍스트의 어조를 정확히 전달
13. 때로는 ListView가 더 효율적
14. 이동 경로(Breadcrumb) 컨트롤과 세로 막대로 간단한 탐색 지원
15. 멋진 그래픽 사용
16. 가급적 크기 조정이 가능한 폼 제공
17. 세로 막대/작업창으로 보다 다양한 기능 제공
18. 알림 옵션 제공
19. 도구 설명 제공
20. 사소한 부분까지 배려
결론
참조 및 자료

소개

개발자들은 한 가지 시각만을 갖는 경우가 흔히 있습니다. 아마도 약간 무미건조할 수 있겠지만 코드에는 분명히 느낌이 있습니다. 그러나 그뿐입니다. 때로는 기술, 그 중에서도 특히 '새로운' 기술과 소프트웨어 기능에 자만하여 최종 사용자가 중요시하는 건 다를 수도 있다는 점을 간과할 수도 있습니다. 아마 지금도 개발자들은 "코드를 보여주세요. 설명은 필요 없습니다!"라고 말할 수도 있습니다. 개발자들은 사용자가 '기대하는 것처럼' 응용 프로그램이 작동하도록 최선을 다합니다. 그러나 사용자들은 단순히 작동하는 것 이상을 바라게 됩니다. 일반 판매용 소프트웨어를 개발하거나 비전문가들이 사용하는 제품을 개발할 경우에는 특히 그렇습니다. 처음에는 다소 불쾌하다고 느껴질 수도 있지만 사용자는 어디까지나 고객이므로 사용자 환경을 좀 더 개선할 수 있는 방법에 대해서 알아보도록 하겠습니다.

만약 사용자가 일주일에 수십 시간을 특정 소프트웨어 응용 프로그램을 보면서 작업하는 데 보낼 경우 최소한 이 소프트웨어가 눈에 편안하기를 바랄 것입니다. 또한 되도록 탐색과 사용이 편리하기도 바랄 것입니다. 문제는 소프트웨어가 대량으로 생산되는 상황에서 소프트웨어 응용 프로그램 중 40% 정도만이 최종 사용자들이 정말 마음에 들어 하고 즉시 편안하게 사용할 수 있는 매우 우수한 UI를 갖추고 있다는 것입니다.

수많은 기업 내부용 소프트웨어가 생산되고 있습니다. 그러나 자체적으로 개발하든 컨설턴트의 도움을 받아 개발하든 보다 나은 UI를 만들기 위한 시간, 노력 또는 비용은 거의 투자되지 않고 있는 실정입니다. 개발 과정에서 '디자이너'의 역할은 미미하며 특히 Windows 응용 프로그램의 경우에는 더욱 그렇습니다. 현재 개발 중인 UI가 형편 없다는 것이 아니며 개발자가 할 수 있는 일들이 아주 많다는 점을 말하고 싶습니다. 이젠 더 이상 "이 정도면 괜찮은 수준" 또는 "프로그램을 개발"하는 것만으로 충분하지 않습니다.

보다 외관이 멋지고 기능이 우수한 응용 프로그램용 UI를 만들려면 준수해야 하는 몇 가지 기본 규칙이 있습니다. 이 기본 규칙을 준수하는 데 있어 시간과 비용이 그다지 많이 드는 것은 아니나 투자수익(ROI)은 분명히 향상됩니다.

자세히 설명하기에 앞서 사용자 인터페이스와 사용자 환경을 구분해 보도록 하겠습니다. 사용자 인터페이스(UI)란 응용 프로그램의 시각적 측면과 컨트롤을 나타내는 반면, 사용자 환경(UX)은 UI 및 그 UI와 관련된 응용 프로그램의 동작뿐 아니라 이 응용 프로그램에서 사용자가 받게 되는 "느낌"까지 포괄합니다. 즉, 단순히 외관이 훌륭한 UI를 설계하는 것이 아니라 성능도 우수해야 한다는 것입니다.

여기서는 응용 프로그램 디자인 단계에서 쉽게 적용할 수 있는 UX 디자인을 위한 20가지 중요한 규칙에 대해서 설명하도록 하겠습니다. 그러면 보다 사용이 쉬운 기능, 즉 "휴먼 UX"를 갖춘 다양한 응용 프로그램을 개발할 수 있습니다. 모두 알다시피 Windows Vista용 응용 프로그램을 제작할 경우에는 다르게 보고 다르게 행동해야 합니다. 여기서 설명하는 내용이 현재 사용자에게는 미래의 프로그램을 미리 경험해 볼 수 있는 기회를 제공하면서 개발자에게는 미래의 응용 프로그램을 준비하는 데 도움이 되기를 바랍니다.

먼저 우수한 UI 디자인의 기본 사항에 대해서 간략하게 설명한 후에 이 주제에 대해서 자세히 살펴보도록 하겠습니다.

적절한 UI를 만들기 위한 기본 원칙

예전에 제 친구 중 하나가 자신이 수석 설계자로 참여했던 응용 프로그램을 자랑한 적이 있었습니다. 기능은 정말 우수하더군요. 그 개발 팀에서 소프트웨어의 핵심 부분을 개발하는 데만도 2년 정도가 걸렸지만 수천 달러의 가격으로 판매될 예정이었던 이 응용 프로그램의 UI는 테마별로 되어 있지 않은 일반 Windows 응용 프로그램보다도 더 단조로웠습니다. 저는 그 친구에게 왜 UI 개선에는 시간을 좀 더 들이지 않았는지 물었습니다. 그는 "Windows 응용 프로그램이기 때문이네. 웹 응용 프로그램이었다면 물론 시간을 더 들였겠지. 하지만 Windows XP라 하더라도 응용 프로그램의 외관을 치장하는 것 이외에 UI에 할 수 있는 일이 무엇이겠나?"라고 대답했습니다.

그의 말은 일리는 있었으나 만약 당신이 Windows Vista에서 가능한 작업을 염두에 둔다면 그의 말이 전적으로 옳지만은 않다는 것을 알 수 있을 것입니다. 창의 모양을 개선하려고 굳이 사용자 지정 스킨을 만들 필요는 없습니다. 진정으로 전문적으로 보이는 UX를 만드는 것은 다음 네 가지 요소에 달려 있습니다.

  • 간격 조정 및 위치 지정
  • 크기
  • 그룹화
  • 사용 편이성

Visual Studio 8.0의 이전 버전에서는 간격 조정과 크기 조정이 매우 어려웠습니다. 4x4 또는 8x8 표 형태가 항상 맞지는 않았기 때문입니다. 하지만 SnapLines가 포함되면서 이 프로세스는 한층 간단해졌습니다. 이 점에 있어서는 이 기능이 매우 만족스러웠으나 레이블 하나를 텍스트 상자에 맞추는 작업이나, 설상가상으로 여러 레이블을 각각 해당 텍스트 상자에 맞추는 작업을 할 때는 종종 광부와 같은 육체 노동 직종으로 바꾸고 싶다는 생각이 들기도 했습니다. 그러나 이제 그런 어려움은 모두 해소되었습니다. 저는 이 SnapLines를 사용해 볼 것을 권장합니다.

이제 위에서 말한 네 가지 측면에 대해서 잠시 살펴보도록 하겠습니다.

간격 조정 및 위치 지정

두 컨트롤 사이의 간격은 중요합니다. 그림 1에는 간단한 사용자 정보 입력 폼이 나와 있습니다. 이 폼에서 위의 두 입력란은 너무 가깝게 붙어있고 그 아래 목록은 너무 멀리 떨어져 있어서 사용되지 않은 공간이 많습니다.

그림 1. 잘못 설계된 폼

그림 2. 올바르게 설계된 폼

그림 2의 경우 대화 상자의 간격이 적절히 조정되어 보다 전문적으로 보입니다. 이 폼은 그림 1의 폼과 동일하지만 SnapLines에서 추천하는 간격을 사용하도록 수정되었습니다. 항상 실제 하단 가장자리가 아닌 입력란의 텍스트 기준선이나 그 옆의 컨트롤과 레이블을 맞출 것을 권장합니다. 원하는 대로 정렬되면 대개 하단 가장자리에서 몇 픽셀 위의 SnapLines 색상이 바뀝니다.

간격 조정에 대한 정확한 규칙은 없으나 가장 좋은 것은 SnapLines를 따르는 것입니다. 적절한 간격을 유지하기 위한 다른 훌륭한 도구로는 컨테이너 도구 상자 그룹 아래의 레이아웃 컨트롤을 들 수 있습니다. TableLayoutPanel은 입력 폼 스타일 대화 상자 생성에 매우 유용합니다.

크기

크기에도 같은 방식이 적용됩니다. 도구 상자에서 폼으로 단추를 끌어올 때 높이와 너비는 완벽한 균형을 이룹니다. 모든 중요한 이유는 배제하고 권장되는 최대 너비는 원래 너비의 두 배입니다. 그렇지 않으면 단추가 두드러져 나와서 팝업 광고와 같이 눈길을 끌게 될 것입니다. 그러면 안 되는데 말이죠!

시작 메뉴의 실행 창 또는 Windows 탐색기 개체의 속성 대화 상자를 살펴보면 단추 크기가 '꼭 맞음'을 알 수 있습니다. 최종 사용자에게 반드시 알리고 싶은 매우 중요한 기능이 있는 경우 큰 단추나 평범하지 않은 화려한 색상을 사용하지 않고도 여러 가지 방법을 사용할 수 있습니다. 이에 대해서는 나중에 설명합니다.

그림 3. 단추 크기 비교

그림 3에는 세 가지 크기의 단추가 나와 있습니다. 첫 번째 단추는 가장 권장되는 크기로 도구 상자에서 끌거나 두 번 클릭하면 기본적으로 생성되는 크기입니다. 텍스트를 추가로 입력하려면 단추를 더 크게 만들어야 합니다. 두 번째 단추는 약간 더 크지만 사용할 수 있는 크기입니다. 다른 컨트롤의 배치를 방해할 정도로 크지는 않기 때문이죠. 그러나 세 번째 단추는 사용하기 어려운 크기입니다. 이 크기의 단추를 사용하면 Windows에서 테마가 적용된 컨트롤을 그릴 때 사용하는 테마 비트맵까지 흐트러진다는 것을 알 수 있습니다. 또한 이 단추 주변에 다른 컨트롤을 맞추기도 매우 어렵습니다.

위에 나온 그림 1의 경우 대화 상자의 크기와 오른쪽의 여백을 감안할 때 두 개의 입력란이 너무 작다는 것을 알 수 있으며 이에 비해 그림 2는 좀 더 적절히 조정된 크기입니다. SnapLines는 크기 조정에도 도움이 됩니다. SnapLines는 특정 상황에서 가장 구체적인 크기 또는 위치를 제안하므로 따르는 것이 좋습니다.

그룹화

거의 모든 응용 프로그램에는 수많은 컨트롤이 있습니다. 적절하고 알아보기 쉽게 그룹화해야만 이러한 컨트롤을 사용하기 쉽게 만들 수 있습니다. 기능에 따른 그룹화 또는 범주별 그룹화를 가장 잘 수행하려면 탭 컨트롤을 사용합니다. 예를 들어 일반적인 비즈니스 응용 프로그램에서는 '계정', '보고서', '직원' 및 '프로젝트'를 탭으로 사용하는 것이 가장 좋습니다. 동일한 최종 결과를 가져오도록 제어하는 형제 그룹화를 가장 훌륭히 수행하려면 그룹 컨트롤을 사용합니다. 이러한 그룹화에 테두리가 있는 패널은 사용하지 않는 것이 좋습니다. 그룹 컨트롤을 사용하면 추가적인 레이블 컨트롤을 사용하지 않아도 됩니다. 특히 하위 컨트롤이 그 자체만으로도 알아보기 쉬운 경우에는 더 그렇습니다.

그룹 컨트롤 내에 그룹 컨트롤을 배치하는 것은 하나의 큰 그룹 컨트롤 안에 2~3개의 컨트롤만 있는 경우가 아니면 권장되지 않습니다. 그룹 컨트롤 안의 다른 그룹 컨트롤 내에 그룹 컨트롤을 배치하는 것은 더더욱 권장되지 않습니다. 이렇게 쓰는 것조차 이상합니다.

사용 편이성

사용 편이성은 훌륭한 사용자 환경에 있어 실제로 중요한 측면입니다. 이해가 쉬운 UX인 경우 설명할 필요가 줄어듭니다. 사용자들이 컨트롤의 기능을 곧바로 알기 때문입니다.

알아보기 쉬운 디자인에서 가장 중요한 것은 색 구분입니다. 가장 좋은 예는 Windows XP 출시 전에 Microsoft에서 발표한 Windows XP Design Guidelines (영문)에 나와 있습니다. Windows XP에서는 테마별 응용 프로그램, 로그오프, 시스템 종료 대화 상자 등에서 탐색과 같은 기능을 위해 모서리가 둥근 새로운 단추를 제공했습니다.

이러한 컨트롤의 색은 해당 단추를 눌렀을 때 나타나는 결과의 심각도에 따라 결정됩니다. 탐색은 '보행' 신호등과 같이 녹색이고 작업 손실이 야기될 수 있는 시스템 종료는 경고 신호와 같이 빨간색이며 로그오프나 최대 절전 모드와 같은 심각도가 덜한 단추는 노란색입니다. 도움말과 같이 사용자의 작업 프로세스에 심각한 영향을 미치지 않는 중립적인 단추는 옅은 파랑색입니다. 스킨이 적용된 UI를 만들 때 이러한 색 구분을 염두에 두어야 합니다.

색으로 콘텐츠를 구분할 수 있는 가장 좋은 예는 Microsoft Office OneNote입니다. 이 응용 프로그램의 탭은 전체 Windows XP 스타일 디자인에 무난하게 어울리도록 하면서도 다양한 색으로 설정할 수 있습니다.

또 하나의 중요한 측면은 응용 프로그램의 텍스트입니다. 최근 소프트웨어에 작성된 명령에서는 표현이 단순화되었습니다. 소프트웨어 내의 텍스트에 대해서는 나중에 설명하도록 하겠지만 사소하면서도 중요한 한 가지 세부 사항에 주목해 주시기 바랍니다. 예를 들어 살펴보겠습니다.

MSN Messenger에는 옵션 대화 상자에 "웹캠 기능 공유"라는 확인란이 있었습니다. 물론 개발자나 해박한 기술 지식이 있는 사람들은 이 기능이 무엇을 의미하는지 압니다. 그러나 초보 사용자는 대화 상대방과 자신의 웹캠을 함께 사용할 수 있는 기능이라 생각할 수 있을 것입니다. 혼동을 주는 설명이었죠. 그래서 최신 버전에서는 "웹캠: 내 웹캠을 통해 다른 사람이 나를 볼 수 있도록 허용"이라는 옵션으로 변경되었습니다. 이 메뉴 옵션은 기술적 지식이 없고 단순한 표현에 익숙한 사람들도 완벽하게 이해할 수 있습니다.

단순한 표현은 이해하기 쉬울 뿐 아니라 나중에 살펴보게 되겠지만 또 다른 이점이 있습니다. 과학적 연구에 따르면 무언가 새로운 것을 이해하려고 할 때 단순한 표현은 의미 파악이 더 쉬운 것으로 나타났습니다. 흔히 인간의 두뇌는 '그것', '~에 대한', '저것'과 같은 단어와 기타 일반적인 단어는 매우 빠르고 쉽게 이해하지만 위의 예에서 볼 수 있듯이 '웹캠' 또는 '다른 사람'과 같은 단어를 이해하는 데는 더 많은 사고 영역을 할당합니다.

메시지 상자 제목, 그룹 상자 캡션 및 기타 비슷한 종류의 텍스트 블록을 사용하면 몇 단어만으로 최종 사용자에게 많은 컨트롤의 기능을 쉽게 전달할 수 있습니다.

사용 편이성은 친숙함에서도 나옵니다. 예를 들어 확인/취소 단추를 함께 배치하는 것은 매우 일반적이므로 우리들의 머리 속에 이 순서대로 각인되어 있어서 만약 어떤 대화 상자에서 확인 다음에 취소가 있지 않고 반대 순서로 취소 다음에 확인이 있는 경우 취소를 누르게 될 수 있습니다. Windows 기반 응용 프로그램과 같이 어떤 작업에 대해 특정 표준을 1년 이상 사용해 온 결과 습관으로 자리잡게 되었습니다. 문서화되어 있지는 않지만 이러한 산업 표준을 따르면 소프트웨어를 사용하기 쉽게 만들 수 있습니다.

다른 예를 살펴보도록 하겠습니다. 초기 Windows Vista 시험판 빌드 중 하나에서는 창의 최소화, 최대화닫기 단추의 순서가 달랐습니다. 이전 버전의 Windows에서는 특히 단일 모니터를 사용하는 경우 화면의 오른쪽 상단 모서리에 커서를 "어림짐작으로 가져가서" 무의식적으로 클릭하는 습관이 생기게 되었습니다. 이렇게 하면 항상 창이 닫히게 되었죠. 그러나 위에서 말한 Windows Vista 빌드에서는 닫기 단추와 창의 가장 오른쪽 가장자리 사이에 8픽셀 정도 되는 여백이 있었기 때문에 오랫동안 자리잡은 "어림짐작으로 하는 클릭"으로는 창이 닫히지 않았습니다. 여분의 공간이 있어 외관상으로 좋아 보이는 것은 물론이며 아마도 이 단추를 누르면 시작되는 화려한 애니메이션에 이러한 공간이 필요할 수도 있었겠지만 창이 닫히지는 않으니 짜증나는 일이었습니다. 습관을 바꾸는 것은 어려운 일이었으니까요. 다행히도 이후 빌드에서는 이 문제가 해결되었습니다. 아마도 저와 같이 어림짐작으로 클릭했던 많은 사람들이 Microsoft에 의견을 보내지 않았을까 싶습니다. 이제 창의 가장자리와 닫기 단추 사이에 공백이 있기는 하지만 그 공백을 클릭해도 창이 닫힙니다. 문제가 해결된 것이죠.

알아보기 쉬운 디자인에서 매우 중요한 점은 '생각해야 하는 영역'이 얼마나 되느냐입니다. 즉, 머리 속에서 무언가를 이해하는 데 걸리는 시간이 어느 정도냐 하는 것이죠. 이 '사고 영역'이 적으면 적을수록 훌륭한 UX라고 할 수 있습니다.

소프트웨어 응용 프로그램 사용 "환경"에 기여하는 사소한 항목들도 있기는 하겠으나 이론만으로도 충분합니다. 심지어 저 조차도 "실용적인" 정보를 원하니까요. 그러므로 이제 이론적인 얘기는 접어 두고 실제로 응용 가능한 팁과 트릭을 사용하여 응용 프로그램을 향상시키는 방법에 대해서 알아보도록 하겠습니다.

보다 효율적이고 편리한 사용자 환경 조성을 위한 20가지 팁

보다 나은 UX를 구축하는 목적은 외관이 훌륭하면서도 간단하고 알아보기 쉬우며 기능이 뛰어난 UI를 얻기 위함입니다. 이제 소프트웨어 응용 프로그램을 사용해 본 경험이 별로 없고 기술적 지식이 그다지 많지 않은 사용자들의 일상 업무에 초점을 두고 살펴보도록 하겠습니다. 아마도 이런 '유형'의 소비자들이 대부분 소프트웨어 응용 프로그램을 사용하겠죠. 아래에 나오는 팁은 보다 효과적인 UI를 만드는 데 도움이 됩니다.

1. 표준 준수

운영 체제 수준, 브랜드 수준 또는 응용 프로그램 수준 등 어떤 수준에서 수립된 것이든 소프트웨어 환경에서 수립된 기준은 매우 중요합니다. 브랜드와 더불어 이러한 표준은 사용자에게는 일종의 신뢰할 만한 방식으로 여겨집니다. 어떤 소프트웨어 응용 프로그램을 사용하여 오랜 시간을 작업할 경우 해당 사용자는 소프트웨어와 점점 친숙해지면서 생산성이 자동으로 향상될 것입니다. 이것은 마치 집 근처의 도로를 운전하는 것과 같습니다. 권유하지는 않지만 아마 이런 경우 눈을 감고도 운전할 수 있을 것입니다.

표준에 대해서 더 설명하기 전에 먼저 이러한 표준이 정확하게 무엇을 의미하는지 알아보도록 하겠습니다. 앞에서 말했듯이 확인/취소의 순서로 단추를 배치하는 것처럼 표준에는 대화 상자의 컨트롤을 특정 방식으로 배치하는 것에서부터 Windows XP 대화 상자의 사용자 인터페이스 창 상단의 둥그런 모서리, 아이콘 스타일, 기타 그래픽 스타일, 응용 프로그램의 대화식 동작 등 모든 것이 포함됩니다.

올바른 표준 집합을 선택하려면 응용 프로그램을 간단히 검사해야 합니다. 새 응용 프로그램을 위한 가장 좋은 표준은 현재 Windows 디자인 지침으로, 당장 사용할 수 있는 최신 표준으로는 Windows XP 디자인 지침을 들 수 있습니다. 응용 프로그램을 디자인하는 중에 곧 다른 운영 체제 버전이 출시될 상황인 경우 이전 버전과의 호환성만 유지된다면 다음 버전용 디자인 지침을 사용하는 것도 무방합니다. 그러면 적어도 최종 사용자에게는 "좀 더 앞서간다"는 느낌을 줄 수 있습니다.

만약 응용 프로그램이 일반적인 응용 프로그램이 아닌 경우 다른 표준 집합을 따르는 것이 좋습니다. 일례로 개발 중인 응용 프로그램이 Microsoft Office OneNote 2003용 응용 프로그램이나 추가 기능을 지원할 경우 Microsoft Office의 UI 스타일과 대화형 작업 표준 및 OneNote 자체의 표준을 따르는 것이 현명합니다. 즉, 시각적, 기능적 면에서 표준 도구 모음이 아닌 Office 스타일 명령 모음을 사용하고 대부분 Office 스타일을 따르는 것을 뜻합니다. 개발 중인 응용 프로그램이 Microsoft Visual Studio .NET 범주에 속할 경우 별도의 표준 집합을 준수해야 합니다. 사실 이러한 추가 기능이나 지원 응용 프로그램을 위해 Microsoft에서는 문서화된 지침을 배포하고 있습니다. 또한 그래픽과 디자인 개념은 종종 보호되는 지적 재산이므로 이러한 디자인을 만들 수 있는 라이선스가 있는지 항상 해당 설명서를 확인해야 합니다.

표준의 세 번째 예는 Tablet PC 환경입니다. 이러한 표준은 운영 체제 지침과 응용 프로그램 지침 사이의 경계를 넘나듭니다. Tablet PC SDK documentation(영문)에는 "응용 프로그램 계획"에 관한 주제와 관련하여 매우 유용한 몇 가지 정보가 수록되어 있습니다. Office 2003 또는 Visual Studio 지침과는 달리 이러한 디자인 권장 사항은 사용자들이 응용 프로그램을 어떻게 사용하는지, 이에 따라 응용 프로그램이 어떻게 작동해야 하는지에 직접적으로 영향을 미칩니다. 예를 들어 응용 프로그램에 고정 창이 있는 경우 설명서에서는 화면 방향이 변경될 경우 감지할 수 있는지 확인하고 필요에 따라 가로, 세로 방향으로 고정 창이 적절히 재구성되도록 하라고 권장합니다. Tablet PC용으로 응용 프로그램을 설계하지 않는다 해도 이러한 지침을 준수하라고 다시 한번 당부 드리고 싶습니다. 개발자인 여러분과 여러분이 개발하는 응용 프로그램은 이러한 지침을 준수함으로 인해 보다 향상될 수 있을 것입니다.

스마트 클라이언트의 출현으로 일반 PC, Tablet PC, 모바일 또는 초소형 모바일 장치, 미디어 센터 PC 등 서로 다른 하드웨어의 경계를 넘어 응용 프로그램이 사용되고 있습니다. 각각의 상황에 맞추어 서로 다른 또는 추가적인 표준 집합을 준수해야 합니다.

응용 프로그램에서 운영 체제 수준 또는 응용 프로그램 수준 표준을 공유할 경우 사용자들은 배우기 쉽고 사용이 편리한 소프트웨어를 통해 편안함을 느낄 수 있으며, 이는 생산성 향상에 직접적으로 이어집니다. 더욱이 사용자들은 프로그램의 사용 방법을 배우기보다는 프로그램을 바로 사용하길 원합니다.

2. 중요 단추에 주의 끌기

때로는 주변에 다른 단추가 4~5개 있는 경우 가장 중요한 단추에 사용자들의 관심을 집중시켜야 하는 경우가 있습니다. 크기, 색상 또는 글꼴 때문에 혼동스럽다면 표준을 위반해도 되기는 합니다. 그러나 물론 권장되지는 않습니다. 대신 간단한 몇 가지 트릭을 사용할 수 있습니다.

그림 4. LinkLabel과 쌍을 이루어 사용하면 단추에 주의가 더 집중됩니다.

첫 번째 트릭은 중요하지 않은 단추를 LinkLable로 변환하는 것입니다. 이렇게 하면 사용자는 이러한 링크가 작업을 수행하게 된다는 것을 알게 되므로 표준 디자인 지침을 위반하지 않고도 먼저 눈에 띄는 단추로 주의를 돌리게 됩니다.

그림 5. 왼쪽에서 오른쪽으로 읽는 습관으로 인해 맨 왼쪽의 단추가 가장 먼저 눈에 띕니다.

두 번째 트릭은 단추를 줄의 가장 처음에 배치하는 것입니다. 즉, 가로로 배치된 경우에는 맨 왼쪽에 세로로 배치된 경우에는 맨 위에 배치합니다. 대상 사용자의 습관에 따라 이러한 배치에 변화가 있을 수 있다는 점을 염두에 두시기 바랍니다. 오른쪽에서 왼쪽으로 읽는 언어로 된 응용 프로그램의 경우 해당 단추를 가장 오른쪽에 두는 것이 좋습니다.

가장 분명하고 권할 만한 옵션은 기본적으로 관심이 집중되도록 설정하라는 것입니다. 예를 들어 삭제 확인 대화 상자에서는 사용자가 실수로 삭제하는 것을 방지하기 위해 아니오 옵션이 강조 표시되어야 합니다.

3. 알아보기 쉽도록 아이콘 제공

"백문이 불여일견"이라는 말이 있습니다. 아이콘, 그 중에서도 특히 XP 및 Office 2003 아이콘과 도구 모음 비트맵은 UI를 파악하고 사용자가 수행해야 하는 작업을 빨리 알아볼 수 있게 해 줍니다.

예를 들어 메시지 상자에서 흔히 볼 수 있는 느낌표 아이콘이 나타나면 이 아이콘 옆의 컨트롤과 관련된 위험 수준을 즉각 알아차릴 수 있습니다. 마찬가지로 응용 프로그램에 컨트롤이 많으면 비록 적절히 배열되어 있다고는 해도 원하는 컨트롤 집합을 찾는 것이 매우 힘들 수 있습니다.

Windows XP 서비스 팩 2에서는 업데이트된 탭이 "자동 업데이트"라는 시스템 속성 제어판 애플릿에 추가되었습니다. 자동으로 업데이트를 다운로드하는 옵션, 업데이트를 다운로드하기는 하지만 사용자가 설치 시기를 결정할 수 있도록 하는 옵션, 업데이트가 있는 경우 사용자에게 알리기는 하지만 다운로드를 시작하지는 않는 옵션 그리고 자동 업데이트를 완벽하게 비활성화하는 옵션 등 4가지 옵션이 있습니다.

초보 PC 사용자인 경우 이러한 업데이트가 무엇을 의미하는지 모르는 것은 물론이며 어떤 옵션을 선택해야 하는지도 모를 수 있습니다. 그렇기 때문에 Microsoft에서는 "안전한" 옵션을 나타내는 가장 권장되는 옵션 옆에는 커다란 확인 표시가 있는 녹색 방패 아이콘을 표시하고 사용자에게 위험을 초래할 수 있는 옵션 옆에는 커다랗게 "x" 표시를 한 빨간색 방패 아이콘을 표시하였습니다. 급박한 상황 특히, 사용자가 너무 많은 설명을 읽을 시간이 없는 경우에 이 아이콘은 매우 유용합니다.

해당 시스템 속성 애플릿의 각 탭에는 서로 다른 작업에 대한 다양한 컨트롤이 있는 그룹 상자가 여러 개 있습니다. 컨트롤 그룹의 작업을 쉽게 나타낼 수 있도록 각 그룹의 옆에는 관련이 있는 그래픽이 표시됩니다. 이 그래픽 코드 유형은 실제 파일이나 주차장의 색 구분선과 유사합니다. 잡지 기사에 독자의 관심을 끌 수 있도록 최소한의 그래픽을 넣는 것과 같은 원칙이 적용됩니다.

올바른 아이콘을 선택하는 것도 중요합니다. Microsoft는 Visual Studio 2005에서 많은 표준 그래픽을 기본으로 제공하므로 이 그래픽을 선택하는 것이 가장 좋습니다. 사용자 지정 아이콘을 만들 경우 위의 표준 준수 섹션에 나와 있는 그래픽에 대한 운영 체제 수준 또는 응용 프로그램 수준의 표준을 준수하는 것이 좋습니다.

Windows XP Design Guidelines (영문)에는 Windows XP 스타일 32비트 아이콘을 만드는 방법에 대한 유용한 지침이 나와 있습니다. Windows Vista 스타일 아이콘에 대한 새로운 지침은 곧 배포될 예정입니다. 자세한 내용은 이 기사 끝 부분에 있는 링크를 참조하십시오.

4. 알아보기 쉽도록 머리글 작성

머리글은 한 문장(필요에 따라 그래픽도 함께 사용할 수 있음)으로 전체 대화 상자를 설명하는 완벽한 방법입니다. 때로는 머리글 내에 탐색 및 명령을 포함할 수도 있습니다. 머리글은 대화 상자가 팝업될 때 가장 먼저 눈에 띄기 때문에 일반적인 설명 레이블보다 더욱 효과적입니다.

Windows Installer 마법사는 아마도 가장 인기 있는 머리글일 것입니다. 맨 오른쪽에 간단한 아이콘이 있고 대화 상자를 설명하는 제목 레이블(예: 설치 폴더 선택) 다음에 대화 상자의 목적을 설명하는 하위 머리글(예: 소프트웨어 파일을 설치할 폴더 선택)로 구성됩니다. 그러나 이러한 원칙은 마법사 이외의 항목에도 적용됩니다.

계정 섹션이 있는 일반적인 업무용 응용 프로그램이 있다고 가정해 봅시다. Windows Vista에서 많이 사용되는 디자인 방식을 따라(그림 6 참조) 머리글 자체(상황에 따라 바닥글)에 필수적인 업무 정보와 관련 명령을 제공할 수 있습니다. 사용자가 "Big Company"에 대한 계정 파일을 열면 그림 7과 같은 머리글이 나타날 것입니다.

그림 6. 상세한 바닥글이 있는 Windows Vista 탐색기

그림 7. Windows Forms 응용 프로그램의 종합적인 머리글

마찬가지로 몇 가지 명령만 있으면 세로 공간이 많이 낭비되는 Windows XP 스타일 작업창을 추가하지 않아도 되며, 이러한 명령을 머리글로 옮기면 번거로움이 많이 사라집니다.

머리글을 설계할 때는 다음과 같은 사항을 염두에 두어야 합니다.

  • 대화 상자의 배경색과 다르도록 배경색을 설정하십시오. 흔히 흰색 머리글을 기본 Windows 내부 컨트롤 표면 색 위에 놓으면 됩니다. 그러나 특수 테마나 사용자 지정 색상으로 인해 머리글이 흐려지지 않도록 하려면 ControlLightControlDark라는 색이 있는 Color.FromKnownColor를 사용하여 LinearGradient를 그리십시오.
  • 가능하면 머리글의 높이를 150픽셀 미만으로 유지하시기 바랍니다. 일반적으로 100 또는 120픽셀이 적당하며, 전체 폼 높이의 1/4을 넘지 않도록 하십시오.
  • 위에 나온 그림 7의 Customer Name과 같은 머리글 정보를 즉석에서 수정할 수 있도록 하려면 동적으로 LinkLabel을 입력란으로 바꾸고 수정이 완료되면 이를 다시 한 번 교체하면 됩니다.
  • 글꼴 크기가 10pt가 넘는 제목 레이블이 있는 경우 Arial이나 Franklin Gothic Medium을 사용하십시오. MS Sans Serif는 너무 들쭉날쭉해서 전문적이지 않게 보입니다. Franklin Gothic Medium은 Windows XP 디자인 지침 설명서에서 권장되는 글꼴입니다. Windows Vista에서 사용되는 응용 프로그램에는 시스템 기본 글꼴인 Segoe UI 글꼴을 사용하십시오.
5. 사용자 지정 메시지 상자 사용

기본 Windows 메시지 상자에서 사용 가능한 옵션은 매우 제한되어 있습니다. 단순한 예/아니오 또는 확인/취소로 답할 수 없는 질문을 해야 할 경우 문제가 복잡해 집니다. 결국 "~하려면 예를 클릭하십시오 또는 ~하려면 아니오를 클릭하십시오"와 같이 설명해야 할 것입니다.

Windows 응용 프로그램은 비전문적인 사용자들이 많이 사용함에 따라 점차 사용이 단순해지고 있습니다. 때로는 작업을 쉽게 수행할 수 있도록 하기 위해 친숙한 설명이 있는 단추나 심지어는 LinkLabel과 같은 추가 컨트롤을 제공하는 것이 보다 간단할 수 있습니다.

.NET Framework에서는 사용자 지정 대화 상자를 쉽게 구현할 수 있습니다. 사용자 지정 대화 상자 폼에 몇 가지 속성만 할당하거나 코드 한 줄만 할당하면 폼이 기본 메시지 상자와 동일하게 작동합니다. 단추를 클릭할 경우 대화 상자의 DialogResult 속성을 DialogResult.Ok 또는 DialogResult.Cancel로 설정하십시오. 상위 폼에서 ShowDialog([OwnerForm]) 메서드를 사용합니다. 그러면 ShowDialog 메서드가 DialogResult 값을 반환합니다.

모든 DialogResult 멤버를 사용할 수 있습니다. 이 동일한 옵션이 기본 MessageBox.Show 메서드에 사용됩니다.

또는 대화 상자의 AcceptButton 속성을 btnOK로 설정하고 CancelButton 속성을 btnCancel로 설정할 수도 있습니다. 그러면 EnterEsc 키가 btnOK 및 btnCancel 단추의 각 Click 이벤트에 자동으로 매핑됩니다.

다음은 사용자 지정 대화 상자를 꾸미는 데 필요한 몇 가지 팁입니다.

  • 복잡한 주제의 경우 적절한 텍스트 레이블 아래 "자세한 정보"라는 LinkLable을 사용하여 로컬 또는 온라인 도움말에 대한 링크를 제공합니다.
  • 예/아니오/취소 단추 대신 단추를 클릭할 경우의 결과를 분명히 나타내는 "파일 저장 후 종료", "저장하지 않고 종료" 및 "종료하지 않음"과 같은 텍스트를 사용합니다. 그러나 가능하면 표준인 예/아니오, 확인/취소 및 기타 표준 단추를 사용하도록 하십시오. 친숙한 단추일수록 작업 효율성이 높아집니다.
  • 왼쪽 또는 대상 문자 환경에 따라 오른쪽에 50픽셀 정도의 여백을 남겨두고 대화 상자를 사용하는 경우를 나타내는 아이콘을 추가합니다. 정보 대화 상자인 경우 표준 메시지 상자에서 사용되는 "i" 아이콘을 사용하고, 보안 대화 상자인 경우 자물쇠 아이콘이나 열쇠 아이콘을 사용할 수 있습니다. Visual Studio 2005에는 몇 가지 우수한 고품질 그래픽이 기본 제공됩니다.
  • 항상 단추 사이를 키보드에서 편리하게 이동할 수 있도록 하십시오. 사용자들은 메시지 상자에서 키보드 단축키를 많이 사용합니다(예: 확인(Ok)은 O, 예(Yes)는 Y, 취소(Cancel)는 C). 사용자 지정 대화 상자에서 단축키를 사용할 수 없으면 사용자들이 불편을 느낄 것입니다.
6. 대체 명령 포함

의욕 저하와 게으름이라는 두 가지 중요 요인으로 인해 대체 입력 방법이 필요하게 되었습니다. 의욕 저하는 컴퓨터 사용자들에게 자주 나타나는 일입니다. 의욕 저하에 빠졌을 때는 작업을 빨리 끝내고 싶어합니다. 스트레스를 받고 있는 사람의 경우 추가로 클릭해야 한다거나 몇 초 간 더 기다려야 한다면 정말로 화가 나겠죠. 어떤 기분인지 아실 겁니다. 우리는 모두 이런 일을 항상 겪고 있으니까요. 게으름으로 인해 사람들은 그 시점에 사용 중인 것이 키보드나 마우스 중 어느 것이든 사용하던 수단으로 작업을 끝내고 싶어합니다. 그러나 이 두 가지 요인 이외에도 대체 입력 방법이 있으면 사용자들은 보다 쉽게 작업을 수행할 수 있게 됩니다.

예를 들어 "추가" 및 "제거"라는 두 개의 단추가 있는 목록 상자의 경우 어느 쪽이든 이러한 단추와 유사한 메뉴 명령이 있는 상황에 맞는 메뉴를 그 목록 상자에 추가해야 합니다. 그러면 사용자에게는 자신들이 가장 적합하다고 생각하는 방식을 선택할 수 있는 기회가 제공됩니다. Windows Vista User Experience Guidelines (영문)에 나와 있듯이 초보 사용자는 상황에 맞는 메뉴를 많이 사용하고 마우스 오른쪽 단추로 클릭하면 항상 이러한 메뉴가 나타날 것이라 예상합니다.

이와 비슷하게 텍스트나 숫자 입력에 시각적 컨트롤이 사용됩니다. 대표적인 예로 슬라이더는 정수 지정에 사용되고 Calendar 컨트롤은 날짜 입력에 사용되는 것을 들 수 있습니다. 때로는 키보드를 사용하여 입력하는 것이 가장 편안합니다. 슬라이더에 연결된 숫자 Up-Down 컨트롤을 추가하거나 Calendar 컨트롤 대신 DateTimePicker를 사용할 경우 사용자는 그 차이를 느낄 수 있습니다.

7. 중요 작업을 처리하는 방법

사용자들은 항상 혼란스러워 합니다. 그렇기 때문에 기술 지원 엔지니어들이 생계를 유지할 수 있습니다. 이 친절한 사람들의 수입을 갉아먹지 않으면서도 개발자들은 몇 가지 방법을 통해 사용자들의 혼란을 덜어주거나 최소한 치명적 오류가 발생했을 때 스스로 복구할 수 있도록 도움을 줄 수 있습니다.

치명적인 복구 불가능한 기능을 수행할 때는 일반적으로 해당 작업을 정말로 수행할 것인지 확인하는 메시지 상자 팝업을 표시하는 것이 좋습니다. 이에 대해서 좀 더 자세히 살펴보도록 하겠습니다. 그림 8에 있는 사용자 지정 메시지 상자는 어디서나 볼 수 있는 것이지만 진행률 표시줄이 있는 타이머가 있다는 추가적인 이점이 있습니다.

그림 8. 기본적으로 가장 안전한 옵션이 선택되어 있는 중요 작업 대화 상자

몇 가지 경우에 따라 변형 메시지 상자를 사용해 볼 수 있습니다. 원자력 발전소의 과부하에서 파일의 영구 삭제에 이르기까지 수행할 작업이 매우 중요한 경우 타이머가 만료된 후의 기본 작업은 취소로 지정합니다. 대화 상자는 사라지면 안 되며 텍스트 레이블에 작업이 취소되었음이 표시됩니다. 사용자는 명령이나 취소를 확인하도록 선택할 수 있습니다.

중요 작업을 수행하는 단추는 항상 분명히 표시하도록 하고 해당 작업을 정확하게 설명하는 분명한 텍스트를 사용해야 합니다. 예를 들어 파일을 삭제하는 작업의 경우 "리포지토리에서 파일 제거"라고 쓰지 말고 "리포지토리에서 파일 삭제"라고 써야 합니다. 파일 목록을 사용하여 작업할 때 삭제 메뉴 명령이 파일 목록에서만 파일을 제거하는 것이 아니라 하드 디스크 자체에서 선택된 파일을 삭제할 경우 이 작업이 심각한 결과를 초래할 수 있다는 점을 적절히 강조하고 이 작업을 수행할 경우 영구적으로 파일이 삭제된다는 점을 분명히 알려야 합니다.

누군가가 "당신은 당신의 최악의 작품만큼의 값어치 밖에 없습니다"라고 말했다고 가정해 봅시다. 이 내용은 소프트웨어 응용 프로그램에도 적용됩니다. 여러분이 개발한 응용 프로그램 사용 시 경험한 단 한 번의 좋지 않은 기억이 그 사용자에게는 상당히 부정적인 인상을 줄 수 있습니다. 이러한 일이 발생하지 않도록 여러분이 취할 수 있는 조치는 응용 프로그램에 오류가 발생할 경우 점차적으로 여파를 줄이는 것입니다. 데이터 복구를 추가하거나 사용자가 해당 데이터의 사본을 저장할 수 있도록 하면 더 유리한 요인이 됩니다. 응용 프로그램에 오류가 발생할 경우 사용자에게 적절히 알려야 합니다. JIT-디버거 또는 중대한 오류 대화 상자는 그다지 좋은 방법이 아닙니다. 오류를 해결하는 방법에 대해 설명하는 것은 이 기사에서 다루는 범위를 벗어나기는 하지만 사용자에게 사과하고 상황에 대해 정확히 알리는 대화 상자를 표시하거나 자세한 정보를 볼 수 있는 링크 또는 이 오류를 복구할 수 있는 방법이 수록된 링크를 제공하면 사용자에게는 매우 큰 도움이 될 것입니다.

이보다 한 발 더 나아가려면 제가 가장 좋아하는 그래픽 디자인 응용 프로그램 중 하나에서 제공하는 기능을 제공하면 됩니다. 이 응용 프로그램은 오류가 발생할 경우 작업 중인 파일의 사본을 저장할 수 있도록 해 주는 복구 대화 상자를 표시한 다음, 물론 선택적 개인 정보이지만 오류에 대한 정보를 입력하여 개발자에게 보낼 수 있도록 해 주는 피드백 대화 상자도 표시합니다.

8. 라디오 단추 또는 콤보 상자

언뜻 보면 많은 항목 중 하나를 선택하도록 하는 방법은 그다지 어렵거나 중요해 보이지 않으나 시간에 민감한 작업에 사용되는 응용 프로그램인 경우에는 중요할 수 있습니다.

실제 예를 하나 살펴보도록 하겠습니다. Microsoft는 최근 그래픽 응용 프로그램인 Expression Graphics Designer(예전 코드명은 "Acrylic")의 시험판 버전을 출시했습니다. 저는 이 응용 프로그램에서 그래픽 개체 약 20개에 특정 속성을 각각 할당해야 했습니다. 정말로 지루한 과정이었죠. 이 작업을 위해서는 개체를 선택하고 설정 창을 표시하는 단추를 클릭한 다음, 옵션을 설정해야 했습니다. 그림 9에 나와 있듯이 한 옵션에서는 콤보 상자에서 두 가지 선택 항목 중 하나를 선택해야 합니다.

그림 9. Microsoft Expression Graphics Designer, Edge Glow 창

콤보 상자 목록을 드롭다운해서 단지 두 개만 있는 선택 항목 중 두 번째 항목을 선택해야 할 경우 정말 번거로울 수 있습니다. 우리가 일반적으로 인식하지 못하는 것은 드롭다운 목록이 나타나는 데 걸리는 시간입니다. 이는 시간 낭비이며 답답한 상황일 수 있습니다. 두 개의 라디오 단추가 있는 그룹 상자를 배치하면 이 문제를 간단히 해결할 수 있습니다. 특히 가용 공간이 많은 경우에 유용합니다. CorelDRAW, Microsoft Access 등의 응용 프로그램에서도 이와 비슷한 문제에 봉착했습니다.

드롭다운 애니메이션 때문에 시간이 낭비될 뿐 아니라 "생각해야 하는 영역"도 허비됩니다. "항상 보이는" 라디오 단추가 있으면 커서로 클릭할 위치를 잠재 의식적으로 알게 됩니다. 콤보 상자가 있는 경우에는 목록이 표시된 '이후'에만 처리됩니다. 이것은 별로 중요한 내용이 아닌 것처럼 보일 수도 있으나 사실상 매우 중요한 문제입니다.

때로는 선택 항목이 4개 이하인 경우에는 라디오 단추를 사용하는 것이 더 좋을 수 있습니다.

9. 사용자를 방해하지 마십시오

머리에 총구를 겨누는 것까지는 아니지만 이는 개발자가 사용자에게 행할 수 있는 가장 파괴적인 일입니다. 여러분의 응용 프로그램이 다른 응용 프로그램을 사용하고 있을 때 메시지 상자를 띄우거나 작업 표시줄을 깜빡이게 해서 불필요하게 방해가 될 경우 그 사용자로부터는 감점을 받게 됩니다.

물론 작업 표시줄의 깜빡임은 유용할 수 있으나 응용 프로그램의 프로세스를 원활하게 계속하기 위해서는 사용자의 입력이 필요한 경우나 사용자에게 전달할 중요한 내용이 있는 경우에만 사용해야 합니다. 사용자가 작업 표시줄을 자동 숨기기로 유지할 경우 작업 표시줄 단추가 깜박이면 작업 표시줄이 가장 위에 나타나서 사용자가 다시 깜빡이는 단추를 클릭할 때까지 숨겨지지 않으므로 상태 표시줄이나 다른 하단에 고정된 컨트롤에 액세스하는 데 방해가 될 수 있습니다.

그림 10. 그래픽과 컨트롤이 여러 개 있는 사용자 지정 팝업 알림 창

MSN Messenger와 같은 인스턴트 메시지 클라이언트에 의해 유명해진 "팝업 알림" 창(그림 10 참조)은 성가시거나 사용자의 작업 흐름을 방해하지 않고도 사용자에게 무언가를 알릴 때 훌륭한 솔루션입니다. 팝업 알림 창을 만드는 방법에 대해 Bill Wagner가 기고한 훌륭한 기사!href(http://msdn.microsoft.com/msdnmag/issues/05/09/WindowsForms/default.aspx)를 읽어보시기 바랍니다. 다른 응용 프로그램의 팝업 알림을 방해하지 않는 것이 좋으며 이것이 매너이기도 합니다. 이러한 창이 나타나서 가로막으면 성가실 뿐 아니라 효율성도 떨어집니다. 한 가지 해결책은 팝업 알림 충돌을 피할 수 있도록 운영 체제에서 제공하는 ToastSemaphore Mutex!href(/library/en-us/WinMessenger/winmessenger/overview/toast.asp)를 사용하는 것입니다.

때로는 팝업 알림별로 여러 항목을 표시해야 할 수 있습니다. 3개 이상의 팝업 알림을 사용하는 것은 권장되지 않습니다. 대신 한 팝업 알림이 사라진 다음에 다른 팝업 알림을 띄우는 것을 반복하는 것이 좋습니다. Microsoft Outlook에서 사용자에게 수신 전자 메일을 알릴 때 이와 비슷한 방법을 사용합니다.

10. 진행 상태 알리기

종종 사용자가 기다려야 하는 작업이 있습니다. 물론 이렇게 기다리는 것은 사용자들이 싫어하는 일 중에 하나입니다. 그러나 최악의 상황은 진행 상태를 모르는 상태에서 기다려야 할 경우입니다. 때로는 응용 프로그램을 웹 서비스나 원격 컴퓨터에 연결해야 할 수도 있고 어떤 이유에서건 대규모의 데이터 처리가 필요한 경우도 있습니다. 이때 사용자는 응용 프로그램에서 어떤 일이 일어나고 있는지를 알아야 합니다. 막연하게라도 말이죠. 상황에 따라 이렇게 사용자에게 작업 상황을 알리는 방식은 여러 가지가 있습니다.

웹 서비스와 같이 멀리 떨어진 개체나 네트워크 또는 인터넷 서버에 있는 항목에 연결해야 할 경우 간단한 진행률 대화 상자(그림 11 참조) 또는 상태 표시줄에서 움직이는 진행률 표시줄을 보여주는 것이 좋습니다. 이때 표시되는 레이블은 현재 진행 상태를 설명해야 합니다. 예를 들어 웹 서비스에 연결하여 어떤 데이터를 처리할 경우 "웹 서비스에 연결하고 있습니다... " 또는 "잠시만 기다려 주십시오. 처리 중입니다... "와 같은 메시지를 표시해야 합니다. 이 프로세스가 동기식으로 이루어질 경우 프로세스가 완료될 때까지 사용자들이 액세스할 수 있는 모든 컨트롤을 비활성화하거나 진행률을 모달 대화 상자에 표시하는 것이 좋습니다.

그림 11. 웹 서비스 연결 상태를 보여 주는 간단한 진행률 대화 상자

진행률 표시줄을 사용 중이고 처리 시간을 알 수 없거나 최대값이 없는 경우 진행률 표시줄 스타일을 움직이는 텍스트 모드로 설정하는 것이 좋습니다.

점점 많이 사용되고 있는 다른 방법으로는 진행률을 표시하는 고정 '팝업 알림' 창을 들 수 있습니다. Microsoft AntiSpyware 다운로더/업데이터 또는 Norton AntiVirus 전자 메일 검색 팝업 알림은 이러한 좋은 예라고 할 수 있습니다. 물론 팝업 알림은 비동기 프로세스에만 사용해야 합니다. 그렇지 않으면 사용자가 당황할 수 있습니다. 이러한 창은 업데이트를 다운로드하거나 예약된 작업을 수행하는 등 백그라운드 처리에 사용하는 것이 가장 좋으며 "항상 위"로 설정하면 안 됩니다.

11. 마법사로 복잡한 단계를 간단히 수행

한 폼에 컨트롤이 너무 많은 경우 일반적인 사용자는 매우 당황할 것이라고 가정해야 합니다. 중요한 컨트롤이 많이 있는 경우에는 그룹화, 크기 조정 또는 간격 지정이 도움이 되지 않을 수도 있습니다.

이러한 경우에 마법사는 가장 좋은 해결책입니다. 가능한 경우 컨트롤을 작업 또는 범주별로 나누고 이를 별도의 단계로 구분할 수 있습니다. 그러면 사용자의 주의를 흐트러트리지 않고 작업을 정상적으로 진행할 수 있습니다. 도움말 단추로 해당 단계별 또는 작업별 도움말을 제공할 수 있습니다. MSDN Library에서 마법사 만들기 지침을 볼 수 있습니다.

마법사는 응용 프로그램의 초기 구성을 설정하는 데 도움이 되는 좋은 방법이기도 합니다. 많은 응용 프로그램은 이러한 마법사를 사용하여 설치가 완료된 후 또는 처음 사용 시에 개별화된 구성을 설정합니다. 이러한 초기 마법사는 가능한 한 옵션으로 제공해야 합니다. 사용자가 언제든 마법사를 취소할 경우 지정되지 않은 설정은 기본값으로 지정됩니다. 마법사에 그래픽적 요소를 첨가할 수 있다면(멋진 그래픽 사용 섹션 참조) 구성 작업이 훨씬 더 쉬워질 것입니다.

12. 텍스트의 어조를 정확히 전달

최근 발표된 Microsoft Windows Vista User Experience Guidelines (영문)에서는 "텍스트 어조"에 대해서 매우 중요한 점을 시사했습니다. 텍스트 어조란 응용 프로그램에서 텍스트가 주는 인상 및 느낌을 말하며, 간단한 도구 설명에서 지침 레이블 컨트롤에 이르기까지 모든 내용이 여기에 해당됩니다.

앞 부분에서 MSN Messenger의 웹캠 옵션의 텍스트를 변경하는 예에 대해서 설명했습니다. 이를 적절한 텍스트 어조라고 합니다. 비전문가 또는 초보 사용자를 대상으로 할 때는 메시지를 전달하는 것이 다른 양상으로 흐를 수 있습니다.

자동 압축 풀기 응용 프로그램에서 입력란 위에 "대상 경로"라고 쓰면 기술적 지식이 있는 사용자는 "C:\Temp\MyPath"와 같은 경로를 입력해야 한다는 것을 알겠지만 초보 사용자는 당황해서 설명서를 참조하거나 기술 지원팀에 문의하거나 최악의 경우에는 아마 여기서 포기하고 말 것입니다. 이런 경우 훌륭한 대안은 "이러한 파일을 저장할 폴더를 선택하십시오."와 같이 사용자가 취하길 원하는 작업을 지정하는 것입니다. 또는 이 입력란 옆의 "찾아보기... " 단추의 이름을 "폴더 선택..."으로 변경할 수도 있습니다.

사용자가 무엇을 하길 원하는지 명확하게 설명하면 도움말 파일을 제공할 필요성도 줄어듭니다. 최소한 도움말 파일에 포함시켜야 하는 세부 정보는 줄일 수 있을 것입니다.

Windows Vista User Experience Guidelines에서 제공하는 매우 훌륭한 제안은 모든 소프트웨어에 적용됩니다. 이 제안에 따르면 개발자는 텍스트를 대화식으로 유지해야 합니다. 이 지침에서는 이를 "직접 대면해서 말하지 못할 내용은 피하라"는 것으로 정의합니다.

다음은 텍스트 작성에 대한 몇 가지 팁입니다.

  • 사용자를 지칭할 때 3인칭을 사용하지 않도록 합니다. "사용자" 대신 "여러분"을 사용해야 합니다.
  • 가능한 한 "이름:" 또는 "전자 메일:" 대신 "내 이름:" 또는 "내 전자 메일 주소:"를 분별해서 사용합니다.
  • 옵션을 여러 개 제공할 때는 사용자의 관점에서 텍스트를 작성합니다. 예를 들어 "이 네트워크에서 [Username]에게 허용할 사용 권한 선택"이라는 레이블 아래에 "허용" 및 "거부"라는 라디오 단추가 있는 경우 이 라디오 단추의 텍스트를 "[Username] 허용" 및 "[Username] 허용 안 함"으로 바꾸어야 합니다.
  • 링크로 사용될 경우에만 텍스트에 밑줄을 긋습니다. 밑줄이 있는 텍스트가 링크가 아니면 사용자에게 혼동을 줄 수 있습니다.
  • 굵은 글씨로 된 레이블로 중요 정보에 주의를 집중시킵니다. 그러나 굵은 글씨는 주의해서 사용해야 합니다. 굵은 글씨로 된 텍스트가 너무 많으면 혼란스럽고 전체적인 폼의 효과가 감소됩니다.
  • 확인란의 텍스트를 작성할 때는 확인란을 선택하거나 선택하지 않았을 때 또는 선택을 취소했을 때 어떻게 되는지 알기 쉽도록 작성해야 합니다. 확인란을 선택할 경우의 叿䉍/᠀젇㠁㠀︂.�პɀĀ＀�ÿ阀䁉需 "귀사의 협력업체로부터 유용한 정보를 수신하지 않음" 대신에 "귀사의 협력업체로부터 유용한 정보 수신"이라고 확인란을 작성하십시오. 많은 마케팅 업계 종사자들은 이 예가 적절치 않다고 목소리를 높일 것이라 생각되지만 여러분은 제가 무엇을 의미하고자 하는지 아실 것입니다.
  • 활성화/비활성화를 제어하는 단추 모양의 컨트롤이 있는 경우(대개 명령 단추가 표시되는 라디오 단추) 레이블을 적절하게 표시해야 합니다. 프로세스가 활성화되어 있으면 "활성화", "비활성화"라 하지 말고 "활성화됨"으로 표시합니다. 활성화됨이라고 작성하면 현재 상태를 나타냅니다. 단추가 클릭된 상태인 경우(활성화됨)에 "활성화"라고 표시되면 혼동할 수 있으며 이로 인해 문제가 될 수 있습니다. "활성화"라고 되어 있으면 사용자가 해당 프로세스가 활성 상태가 아닌 것으로 생각하고 클릭할 수 있기 때문입니다.
13. 때로는 ListView가 더 효율적

우리는 종종 선택 작업을 위해 데이터 표나 목록 상자 또는 콤보 상자를 사용하지만 Windows XP 및 이후 버전의 Windows에서는 ListView를 사용하면 보다 다양한 옵션을 제공할 수 있습니다.

ListView 컨트롤의 장점:

  • 아이콘과 비트맵으로 항목을 빠르게 인식할 수 있습니다.
  • 자세히 또는 바둑판식 보기로 추가 정보를 표시합니다.
  • Visual Studio 2005에는 추가 분류를 위한 그룹도 제공됩니다. 그룹은 모든 보기에 걸쳐 있으며 유연합니다. 그룹은 TreeView와 같이 부모 노드보다 자식 노드가 많은 계층 보기를 평면화하는 데도 사용할 수 있습니다. 이러한 좋은 예는 Windows XP의 네트워크 연결 대화 상자를 "그룹별로 표시"하여 나타내고 보기를 자세히로 설정한 상태입니다.
  • ListView 컨트롤을 사용자 지정하려면 OwnerDraw 속성을 설정하고 DrawItemDrawSubItem 이벤트를 사용하여 수동으로 구성합니다.
  • ListView 항목의 빠른 내부 수정을 지원합니다.
  • 수동 재배열을 손쉽게 지원합니다.
  • 사용자들이 가장 편안한 보기(큰 아이콘, 작은 아이콘, 목록 등)를 선택할 수 있도록 합니다.
14. 이동 경로(Breadcrumb) 컨트롤과 세로 막대로 간단한 탐색 지원

"하위 탐색"은 복잡한 UI에 있어 가장 중요합니다. 때때로 복잡한 UI를 사용해야만 하는 경우도 있습니다. 이런 상황에서 가장 좋은 방법은 가능한 사용자가 쉽게 사용할 수 있도록 지원하는 것입니다. 링크 레이블로 구성된 세로 막대나 계층별 탐색을 위한 TreeView에서는 현재 대화 상자의 작업과 동일한 수준의 탐색이 가능합니다. 이러한 보기에서는 사용자가 자신의 위치를 알면서 프로세스의 단계 간에 쉽게 이동할 수 있습니다.

TreeView에서 계층별 탐색을 하거나 다른 복잡한 탐색을 수행할 경우 이동 경로 컨트롤을 사용하는 것이 유용합니다. Visual Studio에는 아직까지 기본 제공 컨트롤이 없으나 사용자 지정 컨트롤을 만드는 방법에 대해 MSDN에 Duncan MacKenzie가 기고한 훌륭한 기사 (영문)가 있으므로 참조하시기 바랍니다. 이동 경로 컨트롤은 계층과 대비하여 현재 위치를 쉽게 파악할 수 있도록 해 줍니다.

이동 경로 탐색은 폼에 머리글이 있는 경우 이 머리글에 쉽게 병합될 수 있습니다. 앞에서 설명한 머리글에 관한 섹션을 참조하십시오. 그림 7은 머리글의 이동 경로 탐색 모음을 보여 줍니다.

15. 멋진 그래픽 사용

누구나 그래픽이 훌륭한 응용 프로그램을 좋아합니다. 아니 모두는 아니라도 대다수의 사용자가 그렇습니다. 당연히 모든 응용 프로그램의 UI 그래픽을 훌륭하게 만들어야 하는 것은 아니지만 그래픽이 우수하면 좋은 인상을 주고 즐겁게 작업할 수 있습니다. 물론 그래픽이 효율성을 저해해서는 안 되지만 적절히 사용할 경우 효율성이 향상됩니다.

그래픽이 많을 필요는 없으며 반드시 번거로운 작업이 필요한 것은 아닙니다. 전문적으로 설계된 화려한 시작 화면이나 앞에서 말한 것과 같은 머리글은 트릭에 불과합니다. 예산이 허용되는 한도 내에서 도구 모음, 마법사 등에 훌륭한 디자인의 그래픽을 사용할 수 있습니다. 그래픽을 넣으면 응용 프로그램이 외관상 훌륭해 보이며 보다 전문적으로 보입니다. 미묘한 효과이기는 하나 전문적인 외관을 갖추면 자신감과 안정감이 묻어납니다. 일반 판매용 응용 프로그램을 제작하는 상대적으로 규모가 작은 회사인 경우에는 이 점을 중요하게 고려해 봐야 합니다.

항상 전문적으로 설계된 그래픽을 사용하도록 합니다. 로열티가 없는 그래픽은 쉽게 사용할 수 있을 뿐만 아니라 가격도 저렴합니다. 디자이너를 고용할 수도 있습니다. 그러나 그래픽에 소질이 없다면 자체적으로 시도하지 마십시오. 전문적으로 설계된 그래픽을 얻거나 사용할 수 없는 경우 아예 사용하지 않는 편이 낫습니다.

작은 그래픽의 경우 언제나 Visual Studio 2005에서 기본 제공되는 아이콘과 비트맵을 사용할 수 있습니다. 이전 버전에서 기본 제공되는 그래픽은 권장되지 않습니다.

16. 가급적 크기 조정이 가능한 폼 제공

크기 조정이 가능한 창은 해상도와 상관없는 창과 어느 정도 비슷합니다. 해상도와 상관없는 창은 96DPI 화면을 사용하든 300DPI 화면을 사용하든 똑같아 보입니다. 응용 프로그램 UI의 해상도 여부와는 관계없이 크기를 조정할 수 있으면 좋습니다. 물론 많은 경우에 해당되는 내용은 아니지만 일반적으로 적용되는 좋은 규칙입니다.

창에 어떤 종류든 목록이 있는 경우 그 중에서도 특히 ListView는 더욱 중요합니다. 크기 조정을 통해 사용자는 동시에 더 많은 데이터를 볼 수 있습니다.

예를 들어 크기가 큰 컬렉션에서 이미지를 선택해야 하는 응용 프로그램이 있다고 가정해 봅시다. 이 열린 대화 상자에서는 미리 보기를 선택할 수 있으나 대화 상자의 크기가 고정되어 있으면 미리 보기 목록에 미리 보기가 한 번에 4개만 표시됩니다. 컬렉션에 이미지가 100개 있는 경우 이미지를 스크롤하는 반복되는 작업은 매우 지루하고 효율성을 떨어트릴 수 있습니다. 대화 상자의 크기가 조정 가능할 경우 사용자는 가능한 보기 편할 만큼, 아니면 화면에서 허용되는 만큼만이라도 대화 상자를 크게 키우고 작업을 빠르게 마칠 수 있습니다. 자세한 ListView나 DataGrid와 같이 목록에 가로 스크롤이 있는 경우 더욱 지루한 작업이 됩니다. 이러한 상황에서 창의 크기를 조정할 수 있는 기능은 매우 유용합니다.

17. 세로 막대/작업창으로 보다 다양한 기능 제공

앞에서 설명한 머리글과 마찬가지로 세로 막대와 작업창은 추가 기능과 유틸리티 명령을 제공할 수 있는 훌륭한 방법입니다. 예를 들어 Microsoft Office Word 2003의 작업창은 매우 편리하고 액세스가 용이하며 다른 작업에 방해가 되지 않습니다. 온라인 리소스에 연결하면 비동기식으로 작동하므로 사용자는 멀티 태스킹을 수행할 수도 있습니다.

맨 위에 제목 표시줄이 될 그래픽을 정면으로 넣는 옵션을 사용하면 고정 패널을 만드는 것만큼 쉽게 작업창이나 세로 막대를 만들 수 있습니다. 색상이 있는 레이블 컨트롤을 사용할 수도 있습니다. 작업창은 다양하게 활용할 수 있습니다.

추가 기능이 있고 방해하지 않는 방법으로 사용자에게 제공하려는 경우 작업창만큼 좋은 장소는 없습니다. 작업창을 "자동 숨기기"로 설정하거나 Visual Studio 도구 창과 같이 축소할 수도 있습니다. 간단하면서도 종합적인 작업창의 예는 Windows XP와 함께 제공되는 Microsoft Windows Movie Maker의 작업 세로 막대입니다.

18. 알림 옵션 제공

앞에서 사용자 지정 메시지 상자를 만드는 방법을 살펴봤습니다. 응용 프로그램의 메시지 상자가 사용자에게 종종 표시될 경우 앞으로 이 대화 상자가 표시되지 않도록 즉, 비활성화하도록 선택할 수 있는 확인란을 추가하면 세심한 배려가 될 수 있습니다. 이러한 옵션은 특히 보다 분명한 메시지에 유용합니다.

이에 대한 친숙한 예로는 Visual Studio의 찾기 대화 상자를 들 수 있습니다. 텍스트를 검색하거나 바꿀 때 Visual Studio에는 결과를 보여 주는 메시지가 나타납니다. 그러나 이 메시지 상자를 비활성화할 수 있는 옵션도 제공됩니다. 검색할 때마다 Enter 키를 누르거나 확인을 클릭해야 한다면 매우 번거로울 수 있습니다.

Visual Studio의 또 다른 훌륭한 점은 대화 상자를 비활성화하더라도 상태 표시줄에 작업 결과가 표시된다는 점입니다.

19. 도구 설명 제공

때로는 도구 설명이 있으면 많은 시간을 절약할 수 있습니다. 단추, 확인란 및 기타 컨트롤만으로는 확실하지 않아서 사용자가 어떻게 해야 할지 모르는 경우가 있습니다. 도구 설명은 상황에 맞는 도움말을 한 줄로 제공할 수 있는 가장 좋은 형태입니다. 도구 설명이 제공되면 사용자는 도움말 파일에서 항목을 검색하거나 다른 창을 열지 않고도 무엇을 해야 할지 빠르게 결정할 수 있습니다.

개발자들은 종종 응용 프로그램에서 도구 설명을 생략하기도 합니다. 모든 모호한 컨트롤 또는 가능한 경우 모든 컨트롤에 도구 설명을 추가하도록 하십시오. 옆에 나타나는 레이블의 텍스트나 컨트롤 자체에 표시된 텍스트를 반복해서 넣지 말고 해당 컨트롤에 대한 추가 정보를 제공하도록 합니다. 이 텍스트는 몇 단어만으로 컨트롤의 기능을 설명할 수 있어야 합니다.

20. 사소한 부분까지 배려

사소한 부분까지 신경을 쓰는 것이 다소 힘들게 느껴질 수 있으나 이렇게 사소한 부분을 무시하면 여러분에 대한 인상에 영향을 미칠 수 있습니다 저는 예전에 소프트웨어 업계의 저명한 개발자가 만든 응용 프로그램을 사용한 적이 있었습니다. 폼의 테두리 스타일은 조정 가능하도록 설정되어 있었으나 폼 오른쪽의 컨트롤은 고정되어 있지 않았습니다. 이 때문에 업계에서 명성이 있는 개발자가 만든 응용 프로그램이었음에도 그다지 전문적인 프로그램이라는 느낌을 받지 못했습니다.

이러한 "사소한 부분"은 전체적인 인상을 결정하는 중요한 요소입니다. 응용 프로그램의 UI와 UX는 사용자들이 여러분의 응용 프로그램을 판단하는 기준이 됩니다. 최소한 처음에는 말이죠. UI에서 명백한 버그를 발견할 경우 여러분의 응용 프로그램의 기능이나 효율성이 떨어진다고 생각할 수 있습니다. "표지로 책을 판단하지 말라"는 오래된 명언은 소프트웨어 응용 프로그램에는 해당되지 않습니다. 이 경우에는 책에도 해당되지 않습니다.

결론

지금까지 휴먼 사용자 환경을 만들기 위한 팁을 살펴봤습니다. 사용자 환경이 점차 단순하고 효과적이며 재미있고 보다 사용이 편리하게 되면서 사용자 환경을 구축하는 것도 점차 복잡해지고 있습니다. 그러나 어느 정도의 통찰력과 훌륭한 계획이 뒷받침된다면 훌륭한 사용자 환경을 만들 수 있을 것입니다.

완벽한 사용자 환경을 만들기 위한 가장 좋은 방법은 특수 테스트 그룹을 활용하든 자체적으로 하든 UI를 대상으로 유용성 테스트를 실행하는 것입니다. 응용 프로그램을 출시하기 전에 사용자 환경을 테스트하는 데 더 많은 시간을 들이면 들일수록 좋습니다. 이러한 테스트를 통해 추후 발생할 수 있는 많은 문제를 사전에 해결할 수 있습니다.

참조 및 자료

훌륭한 사용자 환경 설계를 위한 기타 다양한 측면에 대해서 알아보려면 아래 나온 자료를 읽어 보는 것이 좋습니다.

  • The Human Factor (영문) 약간 오래되기는 했으나 Scott Berkun이 MSDN에 기고한 이 컬럼은 소프트웨어 및 웹 디자인에 대해 매우 통찰력 있게 접근합니다.
  • Windows Vista User Experience Guidelines (영문) 준비 단계에 있는 경우라도 이 지침을 참조하면 Windows Vista는 물론 일반적인 응용 프로그램을 훌륭하게 설계하는 데 도움이 됩니다.
  • Windows XP Design Guidelines (영문) Windows Vista가 출시될 때까지는 일반적으로 이 지침을 따르는 것이 가장 좋습니다.
  • Tablet PC Documentation (영문) 이 문서 집합에는 훌륭한 Tablet PC 호환 문서를 계획하는 데 필요한 모든 내용이 수록되어 있습니다.

또한 사용자 인터페이스 디자인 및 사용자 환경 디자인에 대한 MSDN Library의 기사도 계속해서 확인하시기 바랍니다.

Dax Pandhi는 소프트웨어 및 기술 그래픽을 전문적으로 취급하며 수상 경력이 있는 기술 스튜디오인 Nukeation Studios (영문)의 주요 개발 책임자입니다. Pandhi는 시각적 기능이 강화된 Windows 및 웹 응용 프로그램뿐 아니라 Windows 프레젠테이션 파운데이션에 기반한 응용 프로그램을 개발하는 데 주력하고 있습니다. Pandhi에게 문의 사항이 있는 경우 그의 블로그 (영문)를 통해 연락할 수 있습니다.

응용 프로그램을 위한 최상의 사용자 환경을 만드는 방법(Windows 사용자 인터페이스 기술 문서)

Posted by 나비:D
:
메시지 필터를 이용하여 F1, F2, F3 .. 키 입력을 후킹하기.
 
 
public class MessageFilter : System.Windows.Forms.IMessageFilter
{
    public bool PreFilterMessage(ref Message m)
    {
        switch(m.Msg)
        {
            case 256 : // WM_KEYDOWN     <==== windows message 를 C# 형태로 쓰고 싶었지만.. 딱히 만들어져있는게 없더군요 그래서
                            //                                    인터넷에서 windows.h 파일을 검색해서 찾았습니다. WM_KETDOWN = 256 번이더군요.
                System.Console.WirteLine(m.LParam.ToInt32());        // 이걸로 F1 부터 여러가지 키를 차례데로 눌러본 값들이
                if( m.LParam.ToInt32() == 3866625 ) // F1 Key            // <===  이 값들입니다. 3866625 가 F1 이군요.. 이런식으로 Key 값을 찾아서
                {                                                                            // 계속 추가하면 키보드 후킹.. 그다지 어려운건 아닐거 같군요 ^^;;
                    System.Console.WriteLine("F1 Press");
                    return true;
                }
                else if( m.LParam.ToInt32() == 3932161 )    // F2 Key
                {
                    System.Console.WriteLine("F2 Press");
                    return true;
                }
                else if( m.LParam.ToInt32() == 3997697 )    // F3 Key
                {
                    System.Console.WriteLine("F3 Press");
                    return true;
                }
                break;
        }
        return false;
    }
}
 
//
//     만들어 놓은 MessageFilter 는 반드시 AddMessageFilter 메서드를 통해 추가해줘야 합니다.
//    static void Main 함수는 기본 Form 에 포함되어 있습니다.  :) 아시죠?
 
static void Main()
{
    Application.AddMessageFilter(new MessageFilter());
    Application.Run(new JapExamples());
}
 
 
아래 있는 것은 windows.h 파일에 정의된 windos message 들입니다. windows.h 파일은 visual studio 안에 INCLUDE_ROOT 에 있습니다.
어딘지는 아시죠?
 
 
WA_ACTIVE 1
WA_CLICKACTIVE 2
WA_INACTIVE 0
WM_ACTIVATE 6
WM_ACTIVATEAPP 28
WM_AFXFIRST 864
WM_AFXLAST 895
WM_APP 32768
WM_ASKCBFORMATNAME 780
WM_CANCELJOURNAL 75
WM_CANCELMODE 31
WM_CAPTURECHANGED 533
WM_CHANGECBCHAIN 781
WM_CHAR 258
WM_CHARTOITEM 47
WM_CHILDACTIVATE 34
WM_CLEAR 771
WM_CLOSE 16
WM_COMMAND 273
WM_COMMNOTIFY 68
WM_COMPACTING 65
WM_COMPAREITEM 57
WM_CONTEXTMENU 123
WM_COPY 769
WM_COPYDATA 74
WM_CREATE 1
WM_CTLCOLORBTN 309
WM_CTLCOLORDLG 310
WM_CTLCOLOREDIT 307
WM_CTLCOLORLISTBOX 308
WM_CTLCOLORMSGBOX 306
WM_CTLCOLORSCROLLBAR 311
WM_CTLCOLORSTATIC 312
WM_CUT 768
WM_DEADCHAR 259
WM_DELETEITEM 45
WM_DESTROY 2
WM_DESTROYCLIPBOARD 775
WM_DEVICECHANGE 537
WM_DEVMODECHANGE 27
WM_DISPLAYCHANGE 126
WM_DRAWCLIPBOARD 776
WM_DRAWITEM 43
WM_DROPFILES 563
WM_ENABLE 10
WM_ENDSESSION 22
WM_ENTERIDLE 289
WM_ENTERMENULOOP 529
WM_ENTERSIZEMOVE 561
WM_ERASEBKGND 20
WM_EXITMENULOOP 530
WM_EXITSIZEMOVE 562
WM_FONTCHANGE 29
WM_GETDLGCODE 135
WM_GETFONT 49
WM_GETHOTKEY 51
WM_GETICON 127
WM_GETMINMAXINFO 36
WM_GETOBJECT 61
WM_GETTEXT 13
WM_GETTEXTLENGTH 14
WM_HANDHELDFIRST 856
WM_HANDHELDLAST 863
WM_HELP 83
WM_HOTKEY 786
WM_HSCROLL 276
WM_HSCROLLCLIPBOARD 782
WM_ICONERASEBKGND 39
WM_IME_CHAR 646
WM_IME_COMPOSITION 271
WM_IME_COMPOSITIONFULL 644
WM_IME_CONTROL 643
WM_IME_ENDCOMPOSITION 270
WM_IME_KEYDOWN 656
WM_IME_KEYLAST 271
WM_IME_KEYUP 657
WM_IME_NOTIFY 642
WM_IME_REQUEST 648
WM_IME_SELECT 645
WM_IME_SETCONTEXT 641
WM_IME_STARTCOMPOSITION 269
WM_INITDIALOG 272
WM_INITMENU 278
WM_INITMENUPOPUP 279
WM_INPUTLANGCHANGE 81
WM_INPUTLANGCHANGEREQUEST 80
WM_KEYDOWN 256
WM_KEYFIRST 256
WM_KEYLAST 264
WM_KEYUP 257
WM_KILLFOCUS 8
WM_LBUTTONDBLCLK 515
WM_LBUTTONDOWN 513
WM_LBUTTONUP 514
WM_MBUTTONDBLCLK 521
WM_MBUTTONDOWN 519
WM_MBUTTONUP 520
WM_MDIACTIVATE 546
WM_MDICASCADE 551
WM_MDICREATE 544
WM_MDIDESTROY 545
WM_MDIGETACTIVE 553
WM_MDIICONARRANGE 552
WM_MDIMAXIMIZE 549
WM_MDINEXT 548
WM_MDIREFRESHMENU 564
WM_MDIRESTORE 547
WM_MDISETMENU 560
WM_MDITILE 550
WM_MEASUREITEM 44
WM_MENUCHAR 288
WM_MENUCOMMAND 294
WM_MENUDRAG 291
WM_MENUGETOBJECT 292
WM_MENURBUTTONUP 290
WM_MENUSELECT 287
WM_MOUSEACTIVATE 33
WM_MOUSEFIRST 512
WM_MOUSEHOVER 673
WM_MOUSELEAVE 675
WM_MOUSEMOVE 512
WM_MOUSEWHEEL 522
WM_MOVE 3
WM_MOVING 534
WM_NCACTIVATE 134
WM_NCCALCSIZE 131
WM_NCCREATE 129
WM_NCDESTROY 130
WM_NCHITTEST 132
WM_NCLBUTTONDBLCLK 163
WM_NCLBUTTONDOWN 161
WM_NCLBUTTONUP 162
WM_NCMBUTTONDBLCLK 169
WM_NCMBUTTONDOWN 167
WM_NCMBUTTONUP 168
WM_NCMOUSEMOVE 160
WM_NCPAINT 133
WM_NCRBUTTONDBLCLK 166
WM_NCRBUTTONDOWN 164
WM_NCRBUTTONUP 165
WM_NEXTDLGCTL 40
WM_NEXTMENU 531
WM_NOTIFY 78
WM_NOTIFYFORMAT 85
WM_NULL 0
WM_PAINT 15
WM_PAINTCLIPBOARD 777
WM_PAINTICON 38
WM_PALETTECHANGED 785
WM_PALETTEISCHANGING 784
WM_PARENTNOTIFY 528
WM_PASTE 770
WM_PENWINFIRST 896
WM_PENWINLAST 911
WM_POWER 72
WM_POWERBROADCAST 536
WM_PRINT 791
WM_PRINTCLIENT 792
WM_QUERYDRAGICON 55
WM_QUERYENDSESSION 17
WM_QUERYNEWPALETTE 783
WM_QUERYOPEN 19
WM_QUEUESYNC 35
WM_QUIT 18
WM_RBUTTONDBLCLK 518
WM_RBUTTONDOWN 516
WM_RBUTTONUP 517
WM_RENDERALLFORMATS 774
WM_RENDERFORMAT 773
WM_SETCURSOR 32
WM_SETFOCUS 7
WM_SETFONT 48
WM_SETHOTKEY 50
WM_SETICON 128
WM_SETREDRAW 11
WM_SETTEXT 12
WM_SETTINGCHANGE 26
WM_SHOWWINDOW 24
WM_SIZE 5
WM_SIZECLIPBOARD 779
WM_SIZING 532
WM_SPOOLERSTATUS 42
WM_STYLECHANGED 125
WM_STYLECHANGING 124
WM_SYNCPAINT 136
WM_SYSCHAR 262
WM_SYSCOLORCHANGE 21
WM_SYSCOMMAND 274
WM_SYSDEADCHAR 263
WM_SYSKEYDOWN 260
WM_SYSKEYUP 261
WM_TCARD 82
WM_TIMECHANGE 30
WM_TIMER 275
WM_UNDO 772
WM_UNINITMENUPOPUP 293
WM_USER 1024
WM_USERCHANGED 84
WM_VKEYTOITEM 46
WM_VSCROLL 277
WM_VSCROLLCLIPBOARD 778
WM_WINDOWPOSCHANGED 71
WM_WINDOWPOSCHANGING 70
WM_WININICHANGE 26
 
Posted by 나비:D
:

출처 : http://blog.naver.com/oioois?Redirect=Log&logNo=150028275081

회사 업무중에 S/W적으로 LCD모니터의 전원을 제어할 경우가 생겨..

가장 심플한 방법을 찾아 C#으로 구현해 보았다.

-.Net 제공 관련 클래스를 찾지 못해 Win32 function 호출하는 방법 채택

-일정 시간 후, 모니터 전원 ON을 위해 Timer 컨트롤 사용

using System.Runtime.InteropServices;

namespace monitorPowerCtlSample
{
    public partial class MonitorPower : Form
    {

        const int WM_SYSCOMMAND = 0x0112;
        const int SC_MONITORPOWER = 0xF170;

        const int MONITOR_ON = -1;
        const int MONITOR_OFF = 2;
        const int MONITOR_STANBY = 1;

        [DllImport("user32.dll")]
        private static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);  

        //Off버튼을 누르면 LCD모니터 전원을 OFF시킴

        private void btnOff_Click(object sender, EventArgs e)
        {
            SendMessage(this.Handle.ToInt32(), WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF);
        }

        //Timer객체의 interval 시간을 적당히 10초정도 추가 테스트

        //10초정도 후에 LCD모니터 전원 ON됨

        private void timer1_Tick(object sender, EventArgs e)
        {
            SendMessage(this.Handle.ToInt32(), WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_ON);
        }

    }

}

테스트 중에 발생한 오류(?)가 있었다.

전원 ON/OFF를 연속적으로 실행하자 LCD모니터가 절전모드로 들어가 버리는 경우가 있었다.

이에 깊은 지식을 갖지 못한 관계로 아직 해답을 찾지는 못했다.

Posted by 나비:D
:

BLOG main image
by 나비:D

공지사항

카테고리

분류 전체보기 (278)
Programming? (0)
---------------------------.. (0)
나비의삽질 (5)
Application (177)
SQL (51)
Web (27)
etc. (14)
Omnia (0)
---------------------------.. (0)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

달력

«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Total :
Today : Yesterday :