JKUN

Welcome To The Jkun.net

Blog

Windows.Forms.ControlPaint - 테두리(Border) 그리기

2014.12.23 12:22 Development/C#


링크 : http://msdn.microsoft.com/ko-kr/library/system.windows.forms.controlpaint(v=vs.110).aspx


테두리 그리는데 여러가지 방법이 있겠지만, ControlPaint 클래스의 DrawBorder 를 이용하면 간단하게 그릴 수도 있다.

	// Handle the Form's Paint event to draw a 3D three-dimensional  
	// raised border just inside the border of the frame. 
	private void Form1_Paint(object sender, PaintEventArgs e)
	{

		Rectangle borderRectangle = this.ClientRectangle;
		borderRectangle.Inflate(-10, -10);
		ControlPaint.DrawBorder3D(e.Graphics, borderRectangle, 
			Border3DStyle.Raised);
	}


저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

System.Drawing - 문자열 그리기 자간에 대해서

2014.12.23 12:18 Development/C#


이미지에 문자열을 그리고자 하는데 맛이 가는 줄 알았다.


DrawString을 이용하면 자간 조정이 안되고,

TextRenderer를 이용하면 안티알리아싱이 안되고;;


워쩌란 말인가; 스택오버플로우에서도 아래와 같이 언급하고 있으나;; 안됨;; 흠..

[DllImport("gdi32.dll", CharSet=CharSet.Auto)] 
public static extern int SetTextCharacterExtra( 
    IntPtr hdc,    // DC handle
    int nCharExtra // extra-space value 
); 

public void Draw(Graphics g) 
{ 
    IntPtr hdc = g.GetHdc(); 
    SetTextCharacterExtra(hdc, 24); //set spacing between characters 
    g.ReleaseHdc(hdc); 

    e.Graphics.DrawString("str",this.Font,Brushes.Black,0,0); // >>> 이게 적용이 안됨 ㅡㅡ^;;
}  


링크 : http://stackoverflow.com/questions/849531/textrenderer-drawtext-in-bitmap-vs-onpaintbackground


이 부분에서 구글링을 해봐도 MSDN 을 뒤져도;; 너무 뒤질양이 많아 뒤지긋네 ㅋㅋ


일단은 포스팅을 해놓고 추가적으로 테스트해봐서 되면 다시 포스팅해야겠네.

저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

통화(원) 표기

2014.12.04 12:46 Development/C#


간단한데 자꾸 까먹어서 포스팅;;

using System.Globalization;//선언해주세엠~


NumberFormatInfo NUM = new CultureInfo("ko-KR", false).NumberFormat;
Console.WriteLine(Convert.ToInt64(100000000000000).ToString("###,###", NUM));


저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

VBS(VisualBasicScript) 파일 실행

2014.11.15 20:15 Development/C#


가끔 동적인 요소나 손쉽게 배치형식의 파일을 작성할때 아직도 VBS 파일은 유용하다.

이때 Process 객체를 이용하여 C#에서 손쉽게 vbs 파일을 호출 할 수 있다.

Process vbsProc = new Process();
vbsProc.StartInfo.FileName = vbsFilePath + @"\RunBatch.vbs";
vbsProc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
vbsProc.Start();
vbsProc.WaitForExit();
vbsProc.Close();



저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

Microsoft.ACE.OLEDB.12.0 공급자는 로컬 컴퓨터에 등록할 수 없습니다.(System.Data)

2014.11.15 20:02 Development/C#


엑셀파일에 OLEDB 공급자로 접근하여 쿼리를 실행시켜 하니;;

Microsoft.ACE.OLEDB.12.0 공급자는 로컬 컴퓨터에 등록할 수 없습니다.(System.Data)


에러작렬;; 구글링하고 오만 개지랄병을 떨어도 안됨;;;

해서 찾다보니 아래와 같은 방법을 하면 왠만하면 거의 다 안정적으로 수행된다.


환경은 아래와 같다.

  • OS : Windows 7 Ultimate 64bit
  • Office : 2010 64bit

순서는 다음과 같다. 


링크 : http://www.microsoft.com/ko-kr/download/details.aspx?id=13255


위 사이트에 가서 32bit 와 64bit 파일을 모두 다운로드 받는다. 왠만하면 둘다 설치해 놓는게

디버깅에 지옥에 빠지느니 신상에 좋을거다.;;;


그리고 OS가 64비트면 64는 그냥 설치한다. 32비트는 32비트용을 설치하면 된다.

하지만 만일 OS가 64비트이고 오피스가 32비트로 설치해놓은 경우가 있다. 이 경우에는 실행되는 프로젝트의

구성을 AnyCPU 가 아닌 x86로 맞춰주는게 좋다.


그리고 OS가 64비트이고 오피스도 64비트인 경우에는 아래와 같은 에러가 발생한다.

그런데 말이 되나. 이거 하나 하자고 오피스를 지운다는게;;

그래도 다행히도 방법은 존재했다.

32비트용 AccessDatabaseEngine.exe 파일을 콘솔창에서 실행시키는 것이다. 대신 매개변수를 하나 더

달아주어야 한다.



AccessDatabaseEngine.exe /passive


그럼 정상적으로 설치가 된다.

만일 배포해야 하는 프로젝트에서 엑셀관련 기능이 있을시에는 Install Shield 에서 위 과정을 포함하는

프로세스를 추가해주면 된다.(나는 그렇게 했음;; ^^;;)

그런데 구글링을 디져라 하면서 여기까지 힘들게 찾아갔는데;;;

http://blog.codefluententities.com/2011/01/20/microsoft-access-database-engine-2010-redistributable/


이미 여기 이분이 너무 깔끔하게 정리를 해놓아 주셨었군요.ㅠㅠ;;

검색도 능력입니다.

http://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&pageno=1&wtype=15&wid=1036&detail=1




저작자 표시
신고
현재 1 개의 댓글이 있습니다.

래리크라운 2016.12.22 11:52 신고

글쓴이님 정말 감사합니다. 2년전의 숙제를 오늘 풀었네요ㅎㅎ


Comment

Blog

Graphics 에서 문자열의 Size 찾기

2014.10.08 09:46 Development/C#


출처 : http://rea1man.tistory.com/entry/C-Graphics에서-문자열의-Size-찾기


Graphics 에 텍스트를 쓸때 배율에 따라 정해진 문자열을 항상 가운데에 위치시키고 싶을때가 있다.


이미지나 도형의 경우 해당 컨트롤이 올라가는 Parent 컨트롤의 Width /2 에서 해당 컨트롤의 Width /2 를 빼주는 방법으로 간단히 처리할 수 있다.


하지만 문자열의 경우는 이를 정확히 알수 없어 화면을 보면서 좌표를 찾아서 하드 코딩하는 경우가 많다.


이를 해결하기 위해 Graphics의 MeasureString 함수를 사용하면 편리하다.

PictureBox pic.Image = new Bitmap(pic.Bounds.Width, pic.Bounds.Height);

Graphics e = Graphics.FromImage(pic.Image);

sText = " 문자열의 Size를 알아보자";
Font fntTextFont = new Font("Verdana", 4, FontStyle.Bold);

SizeF sizTextSize = e.MeasureString(sText, fntTextFont );



저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

using 지시문과 using 문

2014.10.07 15:56 Development/C#


요새 조금씩 C# 을 보다보니 네임스페이스 지정할때 사용하는 using 지시문과 다르게

using 문이 따로 있는것을 보았음;;


구글링하다보니 MSDN 과 데브피아의 한분이 자세하게 설명해준게 있어 링크 검.


MSDN

데브피아

using문을 사용한 리소스 관리는, 좋고 나쁨을 따질수 있는 선택적인 사항이 아니라, 반드시 숙지하고 활용해야 할 사항입니다. 질문에서 약간 벗어난 이야기를 답으로 드리니 참고하셨으면 합니다.

 

using문을 이야기하려면 IDisposable 인터페이스에 대한 이야기를 해야 합니다.

 

기본적으로 닷넷은 가비지 컬렉터에 의해서 모든 리소스를 자동으로 관리한다고 소개하였고 실제로도 그렇습니다. 하지만 중요한 맹점이 하나 있는데, 닷넷 프레임워크 외부의 비관리 영역상의 자원에 대해서는 해당되는 부분이 없습니다. 파일 핸들, 메모리 핸들, 데이터베이스 연결, 소켓 핸들, 스레드 핸들, 세마포어 등의 모든 비관리 자원들에 해당되는 것입니다.

 

단순히 가비지 컬렉터에 의하여 처리되기를 기다린다면 이들 자원들은 사용량이 집중될 경우 고갈되어 시스템에 문제가 생길 수 있습니다. 따라서 이를 사전에 예방하고 효율적으로 관리하기 위해서 명시적인 소멸자를 직접 구현할 수 있는데, 이것이 IDisposable 인터페이스를 통해서 가능합니다.

 

본디, IDisposable 인터페이스로 소거를 시도하기 위해서는 아래와 같은 모양의 문법을 사용합니다.

IDisposable myObj = new SomethingDisposable();
 
try { /* try something here with myObj */ }
catch { throw; }
finally { if (myObj != null) myObj.Dispose(); }
 

위의 코드를 문법적으로 잘 포장한 것이 using 문입니다.

 
using (IDisposable myObj = new SomethingDisposable())
{
   /* try something here with myObj */
}
저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

메세지 박스 ( Confirm Dialog )

2014.09.30 18:38 Development/C#


다이얼로그

if (MessageBox.Show("Are You OK?", "Confirm delete", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
     //TRUE
}

저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

윈폼에서 콘솔창으로 로그 확인

2014.09.29 19:02 Development/C#


구글링하다가 심플하고 고마운 라이브러리 찾음.


http://jenemia.tistory.com/172


ConsoleLib.dll


저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

추상클래스를 왜 사용해야 할까?

2013.12.06 14:43 Development/C#


출처 : http://mrtint.tistory.com/678


왜 추상클래스를 사용해야할까요?

어떤 기술의 사용이라는게 좋은 취지에서 사용이 되었더라도 다른 부분에서의 예기치 못한 불협화음을 만들어 낼 수 있다. 클래스의 상속이 그러할지도 모르겠다. 상속을 설명하며 Animal 이라는 클래스와 Cat, Dog 라는 클래스는 IS 의 관계를 만드는 관계를 맺고 있다. 그러면서 생기는 논리적인 문제는 구체적이지 않은 Animal 이라는 클래스의 인스턴스를 만들 수 있다는 점이다.

Animal ani1 = new Animal();   
Animal ani2 = new Dog();   
Animal ani3 = new Cat();

 그럼 Animal 이라는 클래스로부터 Dog, Cat 이라는 클래스가 공유해야할 것들은 공유하되 직접적인 Animal 클래스의 인스턴스의 생성을 막으려면 어떤 방법을 써야 할지에 대해 고민해봤다. 바로 나온 답은 추상클래스를 사용하는 것이다. 추상클래스를 선언하는 방법은 아주 간단하다. 클래스의 선언 부에만 abstract 라는 키워드를 사용하면 된다. 그리고 기존에 override 가능한 메소드에 virtual 이라고 표시하여 가상 메소드를 만들어 준 것들에 대해서 역시 abstract 라는 키워드를 사용하여 추상 메소드로 변경을 해주면 된다. 더불어 기존 virtual 메소드의 내용을 지우고 선언만 해준다.

변경하면 결과는 아래와 같다.


public abstract class Animal   
{   
    private string name;   
    private string sound;   
  
    public Animal()   
    {   
        this.name = "동물";   
    }   
  
    public string Name   
    {   
        get { return name; }   
        set { name = value; }   
    }   
    public string Sound   
    {   
        get { return sound; }   
        set { sound = value; }   
    }   
  
    public void doWeeping()   
    {   
        Console.WriteLine("{0} : {1} 하고 울어댑니다.", name, sound);   
    }   
  
    public abstract void greeting();   
}  


이렇게 되면 Animal 은 직접 인스턴스를 생성할 수는 없지만 Cat이나 Dog 에서 공통적으로 있어야 하는 Attribute 들이나 doWeeping() 같은 메소드 그리고 프로퍼티들은 공유를 할 수 있게 되어서 보다 효율적인 클래스의 재사용을 가능하게 했다. 이렇게 되면 위에 처럼 ani1, ani2, ani3 변수를 선언하면서 ani1 의 선언은 불가능해진다.

여기까지만 보면 추상클래스를 만든다는 것이 상속할 것들은 가지고 있으되 자신의 인스턴스를 못만드는 클래스인 것 처럼만 비춰지는데 이는 분명 맞는 소리이긴 하지만 더 깊은 의미가 있다.

Animal 이라는 클래스가 구체화 된 일반 클래스였다면 이를 상속받는 클래스들은 greeting() 메소드와 같은 메소드를 반드시 구현해야하는 구속력은 갖고있지 않다. 하지만 반대로 위처럼 추상클래스가 된다면 이를 상속받는 클래스들은 반드시 추상화된 메소드를 오버라이드 해야만 하는 구속력이 생기게 되므로 문법적인 제한을 줄 수가 있다.

디자인 패턴에서는 Template Method Patterns 라는 패턴에서 주로 추상클래스가 쓰였던 기억이 난다. 추상클래스를 사용하여 오버라이드 된 메소드들로 다형성을 사용하여 유연한 소프트웨어 개발을 유도하는 패턴이다.

저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment

Blog

STUDY - C# 프로그램의 일반적인 구조

2013.11.14 11:07 Development/C#


using System;

namespace MyNameSpace//네임스페이스
{
    class MyClass//클래스
    {

    }

    struct MyStruct//구조체
    {

    }

    interface MyInterface//인터페이스
    {

    }

    delegate int MyDelegate();//대리자

    enum MyEnum//열거형
    {

    }

    namespace MySubNameSpace//네임스페이스
    {

    }

    class MyMainClass//클래스
    {
        static void Main(string[] args)//메인함수
        {
            Console.WriteLine("GoTo!");
        }
    }
}


저작자 표시
신고
현재 0 개의 댓글이 있습니다.
Comment