데이터 형 의미
BOOL 논리형. TRUE 또는 FALSE 값만 가질 수 있음
BYTE unsigned char (8 bit)
DWORD unsigned long (32 bit)
DWORDLONG unsigned double (64 bit)
FLOAT float
LONG signed long (32 bit)
LONGLONG signed double (64 bit)
LPARAM 32 bit 메시지 파라미터
LPCSTR 널 문자로 끝나는 윈도우 문자열 상수의 포인터
LPCTSTR 널 문자로 끝나는 유니코드 또는 윈도우 문자열 상수의 포인터
LPSTR 널 문자로 끝나는 윈도우 문자열의 포인터
LPTSTR 널 문자로 끝나는 유니코드 또는 윈도우 문자열의 포인터
TCHAR 유니코드 또는 윈도우 문자
UINT unsigned int (32 bit)
WORD unsigned short (16 bit)
WPARAM 16 bit 메시지 파라미터
2009년 4월 15일 수요일
[Visual C++]윈도우에서 정의된 데이터 형
라벨:
C/C++
2009년 4월 13일 월요일
[잡설] 와이프의 한마디
어제 가족끼리 어린이 대공원에 소풍을 다녀와서 너무 피곤해 그냥 골아떨어져 잠들었다.
그러다 오늘 아침에 일어나 아침이랑 도시락(아들 반찬 포함해서)만들다 7시에 와이프 깨웠지.
많이 피곤했는지 뒤척이며 일어나 켜놨던 뉴스를 가만히 쳐다본다.
한참 가만히 있다 한마디 건넨다.
마눌님: "MB가 올해 몇 년차지..?"
나: (버섯 삶다가) 음.. 2년차지..
마눌님: "...."
나: "?"
마눌님: "망할 거 같애."
나: "?? 응?"
마눌님: "위에서 너무 생각이 없는 거 같아... 곧 이 나라 망할 거 같애.."
나: ".....;; "
잠 잘자고 일어나서 이런 소리를 한다.
악몽을 꿨나...?
하긴... 요즘은 좀 무섭기는 해...
우리 와이프 진짜 정치에 대해서는 잘 모르고... 알고 싶어하지도 않는데 저런 소리를 한다.
얼마나 실망하셨길래.. 에휴~~~
그러다 오늘 아침에 일어나 아침이랑 도시락(아들 반찬 포함해서)만들다 7시에 와이프 깨웠지.
많이 피곤했는지 뒤척이며 일어나 켜놨던 뉴스를 가만히 쳐다본다.
한참 가만히 있다 한마디 건넨다.
마눌님: "MB가 올해 몇 년차지..?"
나: (버섯 삶다가) 음.. 2년차지..
마눌님: "...."
나: "?"
마눌님: "망할 거 같애."
나: "?? 응?"
마눌님: "위에서 너무 생각이 없는 거 같아... 곧 이 나라 망할 거 같애.."
나: ".....;; "
잠 잘자고 일어나서 이런 소리를 한다.
악몽을 꿨나...?
하긴... 요즘은 좀 무섭기는 해...
우리 와이프 진짜 정치에 대해서는 잘 모르고... 알고 싶어하지도 않는데 저런 소리를 한다.
얼마나 실망하셨길래.. 에휴~~~
라벨:
개인
2009년 3월 31일 화요일
[심장]17번 심장수술 이긴 ‘기적의 소녀’ 감동
뉴스: 17번 심장수술 이긴 ‘기적의 소녀’ 감동
정말 대단하다. 뉴스에 나온 저 소녀(사라 하셀그로브)는 13살까지 무려 17번의 심장 수수을 받았단다. 내 아이도 태어난지 1주일만에 심장수술을 했기 때문에 그 고통이 어떤 것인지 알고 있다. 정말.. 사라의 부모님이 얼마나 큰 고통을 받았어야 했을지...
한 번도 정말 힘든데 17번이라니..( 그 중에 태어난 해 받은 수술은 5번) 기가 막히다.
정말 살고자 하는 의지가 강한 아이다. 부디... 계속 건강하게 잘 자라주기를 바란다.
정말 대단하다. 뉴스에 나온 저 소녀(사라 하셀그로브)는 13살까지 무려 17번의 심장 수수을 받았단다. 내 아이도 태어난지 1주일만에 심장수술을 했기 때문에 그 고통이 어떤 것인지 알고 있다. 정말.. 사라의 부모님이 얼마나 큰 고통을 받았어야 했을지...
한 번도 정말 힘든데 17번이라니..( 그 중에 태어난 해 받은 수술은 5번) 기가 막히다.
정말 살고자 하는 의지가 강한 아이다. 부디... 계속 건강하게 잘 자라주기를 바란다.
라벨:
Heart
2009년 3월 30일 월요일
[C#]입력된 int를 LWORD 또는 HWORD로 전환하기
다음 method를 이용하면 원하는 대로 수정이 가능하다.
이 method는 다음 처럼 사용하여야 한다.
public IntPtr MakeLParam(int LoWord, int HiWord)
{
return (IntPtr)((HiWord << 16) | (LoWord & 0xffff));
}
이 method는 다음 처럼 사용하여야 한다.
private void buttonSaveNNext_Click(object sender, System.EventArgs e)
{
public uint g_WMReqPACSOperation;
g_WMReqPACSOperation = RegisterWindowMessage("Save and Next");
if (Save() && g_strStudyKey != string.Empty)
{
MakeLParam(0, 2);
IntPtr lParam = ICode.MakeLParam(0, 2);
SendMessage(g_WMReqPACSOperation, g_strStudyKey, lParam);
}
}
라벨:
C#
[C#]주어진 문자(영문이든 한글이든) 원하는 길이 만큼 잘라내기
요즘 작업하는 일 중에 고객사의 요청으로 최대 6자(한글은 3자)까지만 허용할 수 있는 - 즉, 그 길이를 넘어가면 잘라내도록 - 기능을 추가했다.
일단 아래 코드를 먼저 보자.
인터넷에 돌아다니던 method이다. 어떤 문자이든 일단 method에 넣어 원하는 길이를 넣으면 그 만큼 잘라낸다.
여기서 문제가 발생하는데 한글인지 영문인지 단순 바이트로 구분할 수가 없다는 것이다. 쉽게 다른 블로거님이 작성한 내용을 참고해보자.
"부연 설명
유니코드 인코딩으로 GetBytes를 해보면 한글이나 영문이나 배열을 2칸씩 사용하면서 정보가 들어갑니다. 그러나 영문은 1 byte이기 때문에 2번째 칸에는 무조건 0이란 값만 들어가게 됩니다. 필요없는 데이터가 함께 들어가더군요.
아스키 인코딩으로 해보면 한글을 인식하지 못하기 때문에 한글 정보가 제대로 들어가지 않습니다. 한글을 1바이트 안에 넣으려고 하죠.
하지만 위에서 사용한 인코딩 방법은 한글은 배열을 2칸씩, 영문은 1칸씩 사용하면서 넣어줍니다. 덕분에 문자열이 한글이든 영문이든 바이트 단위로 잘 가져올 수 있더군요."
위의 내용처럼 한글이든 영문이든 같은 크기의 바이트를 사용하기 때문에 바이트 크기로 구분할 수는 없다. (개인적으로 참고한 블로그이니 따로 참고할 자료가 필요하다면 글에 걸려있는 링크를 따라가 보기를 바란다.)
즉, 6자(한글 3자)를 넘기면 무조건 길이에 맞게 잘라내야 한다고 가정해보자. 그러면 한글이 "가나다라바사"이면 분명 "가나다"까지만 check되어 잘라야 하지만 구분할 단순 length로는 판단이되지 않기 때문에 다른 방법이 필요하다는 것이다.
그래서 다음과 같이 풀었다. 아예 code를 보면서 얘기하자.
위의 code 처럼 char array로 복사하여 문자별로 비교하여 한글인지 check하고 만약 한글자라도 한글이 있다면 그에 맞게 처음 설명한 code를 이용하여 입력된 길이에 맞게 잘라내는 것이다.
위의 code들은 실제 사용되고 있는 code로 사용자 id와 name을 한글은 3자, 영문은 6자를 넘어가면 잘라서 입력하기 위해 만들어진 code이다.
InsertCommand는 OleDbCommand[] InsertCommand로 sql 명령문을 실행하기 위한 프로시져이다. 그리고 arg_UserId, arg_UserName는이 sql에서 사용하기 위한 아규먼트이다.
일단 아래 코드를 먼저 보자.
public string GetWordByByte(string src, int Bytecount)
{
System.Text.Encoding myEncoding
= System.Text.Encoding.GetEncoding("ks_c_5601-1987");
byte[] buf = myEncoding.GetBytes(src);
string strResult = myEncoding.GetString(buf, 0, Bytecount);
if (Bytecount != strResult.Length)
strResult = myEncoding.GetString(buf, 0, Bytecount);
return strResult;
}
인터넷에 돌아다니던 method이다. 어떤 문자이든 일단 method에 넣어 원하는 길이를 넣으면 그 만큼 잘라낸다.
여기서 문제가 발생하는데 한글인지 영문인지 단순 바이트로 구분할 수가 없다는 것이다. 쉽게 다른 블로거님이 작성한 내용을 참고해보자.
"부연 설명
유니코드 인코딩으로 GetBytes를 해보면 한글이나 영문이나 배열을 2칸씩 사용하면서 정보가 들어갑니다. 그러나 영문은 1 byte이기 때문에 2번째 칸에는 무조건 0이란 값만 들어가게 됩니다. 필요없는 데이터가 함께 들어가더군요.
아스키 인코딩으로 해보면 한글을 인식하지 못하기 때문에 한글 정보가 제대로 들어가지 않습니다. 한글을 1바이트 안에 넣으려고 하죠.
하지만 위에서 사용한 인코딩 방법은 한글은 배열을 2칸씩, 영문은 1칸씩 사용하면서 넣어줍니다. 덕분에 문자열이 한글이든 영문이든 바이트 단위로 잘 가져올 수 있더군요."
위의 내용처럼 한글이든 영문이든 같은 크기의 바이트를 사용하기 때문에 바이트 크기로 구분할 수는 없다. (개인적으로 참고한 블로그이니 따로 참고할 자료가 필요하다면 글에 걸려있는 링크를 따라가 보기를 바란다.)
즉, 6자(한글 3자)를 넘기면 무조건 길이에 맞게 잘라내야 한다고 가정해보자. 그러면 한글이 "가나다라바사"이면 분명 "가나다"까지만 check되어 잘라야 하지만 구분할 단순 length로는 판단이되지 않기 때문에 다른 방법이 필요하다는 것이다.
그래서 다음과 같이 풀었다. 아예 code를 보면서 얘기하자.
bool bHangul = false;
char[] cLoginUserID = g_strLoginUserID.ToCharArray(0, g_strLoginUserID.Length);
foreach (char c1 in cLoginUserID)
{
if (char.GetUnicodeCategory(c1) ==
System.Globalization.UnicodeCategory.OtherLetter) // 한글인지 check
{
bHangul = true;
break;
}
else
bHangul = false;
}
if (bHangul)
InsertCommand[iRow].Parameters.Add("@arg_UserId",
OleDbType.VarChar).Value = CommFunc.GetWordByByte(g_strLoginUserID, 6);
else
InsertCommand[iRow].Parameters.Add("@arg_UserId",
OleDbType.VarChar).Value = g_strLoginUserID;
char[] cLoginUserName =
g_strLoginUserName.ToCharArray(0, g_strLoginUserName.Length);
foreach (char c2 in cLoginUserName)
{
if (char.GetUnicodeCategory(c2) ==
System.Globalization.UnicodeCategory.OtherLetter) // 한글인지 check
{
bHangul = true;
break;
}
else
bHangul = false;
}
if (bHangul)
InsertCommand[iRow].Parameters.Add("@arg_UserName",
OleDbType.VarChar).Value = CommFunc.GetWordByByte(g_strLoginUserName, 6);
else
InsertCommand[iRow].Parameters.Add("@arg_UserName",
OleDbType.VarChar).Value = g_strLoginUserName;
위의 code 처럼 char array로 복사하여 문자별로 비교하여 한글인지 check하고 만약 한글자라도 한글이 있다면 그에 맞게 처음 설명한 code를 이용하여 입력된 길이에 맞게 잘라내는 것이다.
위의 code들은 실제 사용되고 있는 code로 사용자 id와 name을 한글은 3자, 영문은 6자를 넘어가면 잘라서 입력하기 위해 만들어진 code이다.
InsertCommand는 OleDbCommand[] InsertCommand로 sql 명령문을 실행하기 위한 프로시져이다. 그리고 arg_UserId, arg_UserName는이 sql에서 사용하기 위한 아규먼트이다.
라벨:
C#
피드 구독하기:
게시물 (Atom)
