출처 : http://blog.naver.com/techshare/220138680455


Visual Studio 2013에서 가장 아쉬운 부분이 바로 매크로인데요. 다행히 "Visual Commander" 확장 도구를 이용하면 그와 같은 제약에서 벗어날 수는 있습니다.

Visual Commander
; http://vlasovstudio.com/visual-commander/


현재 Free, Professional 제품으로 나누어서 판매하고 있습니다.

Free 버전 다운로드 (Visual Commander v1.5 - December 23, 2013)
; http://vlasovstudio.com/visual-commander/VisualCommander_15.vsix

Professional Edition 구매 ($39)
; http://vlasovstudio.com/visual-commander/professional_edition.html


사용법도 간단합니다. vsix 설치 후 Visual Studio를 실행하면 "VCMD" 메뉴가 생기는데 거기서 "Commands"를 선택한 후 "Add" 버튼을 누르면 다음과 같이 기본 매크로 함수를 위한 뼈대가 생성됩니다.




예를 들어, 제가 Visual Studio 2010에서 사용했던 매크로 함수는 다음과 같은데요.

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE100
Imports System.Diagnostics

Public Module InsertTag

    Sub InsertCenterHr()
        Dim selection As TextSelection

        If (ActiveDocument() Is Nothing) Then
            Exit Sub
        End If

        selection = DTE.ActiveDocument.Selection()

        Dim str As String
        str = "<hr style='width: 50%' />" & Environment.NewLine
        SetText(selection, str)
    End Sub

    Sub SetText(ByVal selection As TextSelection, ByVal txt As String)
        Dim prop As EnvDTE.Property
        prop = DTE.Properties("TextEditor", "PlainText").Item("IndentStyle")
        Dim previousIndent = prop.Value
        prop.Value = 0

        selection.Text = txt

        prop.Value = previousIndent

    End Sub

End Module


이를 Visual Commander에서는 다음과 같이 동일하게 코드를 복사해서 사용할 수 있습니다.

Imports EnvDTE
Imports EnvDTE80
Imports System

Public Class C
    Implements VisualCommanderExt.ICommand

    Sub Run(DTE As EnvDTE80.DTE2, package As Microsoft.VisualStudio.Shell.Package) Implements VisualCommanderExt.ICommand.Run

            Dim selection As TextSelection
            Dim activeDocument As EnvDTE.Document

            activeDocument = DTE.ActiveDocument

            If (activeDocument Is Nothing) Then
                    Exit Sub
            End If

            selection = activeDocument.Selection()

            Dim str As String
            str = "<hr style='width: 50%' />" & Environment.NewLine
            SetText(DTE, selection, str)        
    End Sub


        Sub SetText(DTE As EnvDTE80.DTE2, ByVal selection As TextSelection, ByVal txt As String)
            Dim prop As EnvDTE.Property
            prop = DTE.Properties("TextEditor", "PlainText").Item("IndentStyle")
            Dim previousIndent = prop.Value
            prop.Value = 0

            selection.Text = txt

            prop.Value = previousIndent

        End Sub
End Class


보시는 바와 같이 DTE 변수를 넘겨준다는 점을 제외하고는 거의 차이가 없습니다.

불편한 점은 사용법에 있습니다. 이전에는 매크로 탐색기에서 해당 매크로를 더블-클릭하면 실행이 가능했지만, "Visual Commander"의 경우 "Commands" 창에서 더블-클릭해 실행하는 것을 지원하지 않고 있습니다. 매번 "VCMD" 메뉴를 펼쳐서 새롭게 등록된 명령어를 선택해 줘야 하는데요. 물론 이 부분은 기본적으로 단축키 등록을 통해 우회적으로 해결할 수는 있지만 어쨌든 불편한 것은 사실입니다. 
(이 부분을 제가 요청했는데 최신 버전에서 개발자가 그 의견을 받아들여 수정했습니다. 이제 예전의 Macro Explorer처럼 편리하게 사용할 수 있습니다.) 

매크로가 그리웠던 분들... ^^ 지금 설치해 보세요.




참고로 아래 코드는 현재 제가 사용하고 있는 _T("") 자동으로 해 주는 매크로 소스입니다.

Imports EnvDTE
Imports EnvDTE80
Imports Microsoft.VisualBasic

Public Class C
	Implements VisualCommanderExt.ICommand

	Sub Run(DTE As EnvDTE80.DTE2, package As Microsoft.VisualStudio.Shell.Package) Implements VisualCommanderExt.ICommand.Run

		'DESCRIPTION: This macro will automatically put "_T( )" around 
		'             your strings, Author: Orin Walker, 1999, Version 1.1
		'             Last change - Acidpop(http://acidpop.tistory.com) (2012.09.07)
		'             Supported Visual Studio 2010 Macro
		Dim iCount As Integer
		Dim bFoundAQuote As Boolean
		Dim strTemp As String
		Dim strStuffAtEnd As String
		Dim bDone As Boolean
		Dim str As String
		Dim strBuildString As String
		Dim Selection As TextSelection
		Dim win as Window

		win = DTE.ActiveWindow
		If (win.type <> EnvDTE.vsWindowType.vsWindowTypeDocument) And (win.type <> EnvDTE.vsWindowType.vsWindowTypeCodeWindow) Then
'			MsgBox( "type=" & win.type & "  Doc=" & EnvDTE.vsWindowType.vsWindowTypeDocument & "  CodeWin=" &  EnvDTE.vsWindowType.vsWindowTypeCodeWindow )
			Exit Sub
		End If

		iCount = 0
		bFoundAQuote = False
		DTE.ActiveDocument.Selection.SelectLine()
		strTemp = DTE.ActiveDocument.Selection.Text

		Selection = DTE.ActiveDocument.Selection

		strStuffAtEnd = ""
		While bDone <> True
			str = ParseString(strTemp, bFoundAQuote, strStuffAtEnd)
			strBuildString = strBuildString + str

			If bFoundAQuote = True Then
				strTemp = strStuffAtEnd
			Else
				bDone = True
				'DTE.ActiveDocument.Selection.Delete()
				'DTE.ActiveDocument.Selection = strBuildString
				Selection.Text = strBuildString
			End If
			iCount = iCount + 1
			If iCount > 100 Then    ' safety valve
				bDone = True
			End If
		End While
		'End If
	End Sub
    Function ParseString(ByVal strTemp, ByRef bFoundAQuote, _
                         ByRef strStuffAtEnd)
		Dim strSpace As String
		Dim iLen As Integer
		Dim iPos As Integer
		Dim x As Integer
		Dim strCheck As String
		Dim iUnderscoreTPos As Integer
		Dim strBeforeFirstQuote As String
		Dim strNewTempStr As String
		Dim strRemaining As String
		Dim strStuffInQuotes As String


		'DESCRIPTION: This is a helper function for the UnderscoreT macro,
		'             Author: Orin Walker, 1999, Version 1.1
		' Comment in/out whatever style you prefer       
		strSpace = ""   ' NO space before or after "_T("
		'strSpace = " " ' Add a space before and after "_T("
		iLen = Len(strTemp)
		bFoundAQuote = False
		' Get the position of the first quote on the line
		iPos = InStr(strTemp, Chr(34))
		If iPos > 0 Then    'a quote was found
			' Go back and see if we have an existing 
			' _T( defined for this quote
			x = iPos - 5          ' Go back up to 5 characters
			If x <= 0 Then      ' If we have reached the 
				' beginning of our string
				x = 1           ' Set x to start at the first character
			End If
			strCheck = Mid(strTemp, x, iPos)

			iUnderscoreTPos = InStr(strCheck, "_T(")

			' If we found one grab everything before the first quote
			strBeforeFirstQuote = Mid(strTemp, 1, iPos - 1)
			If iUnderscoreTPos > 0 Then     ' we found an "_T("
				' Do NOT add the "_T(" to our temporary string
				strNewTempStr = strBeforeFirstQuote
			Else
				' Now create our new temporary string and append "_T("
				strNewTempStr = strBeforeFirstQuote + "_T(" + strSpace
			End If
			' Get the remaining string
			strRemaining = Mid(strTemp, iPos + 1, iLen)

			iLen = Len(strRemaining)
			' Now find the second quote
			iPos = InStr(strRemaining, Chr(34))

			If iPos > 0 Then
				' If we found one save the stuff in quotes
				strStuffInQuotes = Chr(34) + Mid(strRemaining, 1, iPos)

				' And grab the stuff after the quotes
				strStuffAtEnd = Mid(strRemaining, iPos + 1, iLen)

				If iUnderscoreTPos > 0 Then     ' we found an _T(
					' Do NOT add the final ")" to our parsed string, 
					' because it alreasy exists
					ParseString = strNewTempStr + strStuffInQuotes
				Else
					' Create our parsed string
					ParseString = strNewTempStr + strStuffInQuotes + _
						strSpace + ")"
				End If
				bFoundAQuote = True
			Else
				' No SECOND quote was found so just return 
				' what was passed in
				ParseString = strTemp
			End If
		Else
			' No quote was found so just return what was passed in
			ParseString = strTemp
		End If
    End Function
End Class

 

 

 

 

다음은 CPP 파일과 .H 파일을 서로 왔다 갔다 해 주는 소스입니다.

Imports EnvDTE
Imports EnvDTE80
Imports Microsoft.VisualBasic
 
Public Class C
    Implements VisualCommanderExt.ICommand
 
    Function GetFilenameFromPath(ByVal strPath As String) As String
        ' Returns the rightmost characters of a string upto but not including the rightmost '\'
        ' e.g. 'c:\winnt\win.ini' returns 'win.ini'

        If Right$(strPath, 1) <> "\" And Len(strPath) > 0 Then
            GetFilenameFromPath = GetFilenameFromPath(Left$(strPath, Len(strPath) - 1)) + Right$(strPath, 1)
        End If
    End Function

    Sub Run(DTE As EnvDTE80.DTE2, package As Microsoft.VisualStudio.Shell.Package) Implements VisualCommanderExt.ICommand.Run
        '////////////////////////////////////////////
        'Nooruddin Kapasi 1998.
        'Pavel Sokolov , CEZEO software , http://www.cezeo.com , Adaptation for .NET
        'DESCRIPTION: Switch Between Header and cpp
        '////////////////////////////////////////////

        Dim a As String
        Dim b As String
        Dim Flag As Integer
        Dim tmp As String
        Flag = 0
        a = DTE.ActiveDocument.FullName()
        tmp = InStr(a, ".cpp")
        If tmp Then
            b = Left(a, Len(a) - 3) + "h"
            Flag = 1
        Else
            tmp = InStr(a, ".h")
            If tmp Then
                b = Left(a, Len(a) - 1) + "cpp"
                Flag = 1
            End If
        End If

        If Flag Then
            Try
                DTE.Documents.Open(b, "Text")
            Catch
                a = GetFilenameFromPath(DTE.ActiveDocument.FullName())
                tmp = InStr(a, ".cpp")
                If tmp Then
                    b = Left(a, Len(a) - 3) + "h"
                    Flag = 1
                Else
                    tmp = InStr(a, ".h")
                    If tmp Then
                        b = Left(a, Len(a) - 1) + "cpp"
                        Flag = 1
                    End If
                End If

                a = DTE.Solution.FindProjectItem(b).FileNames(0)
                DTE.Documents.Open(a, "Text")

            End Try

        End If
    End Sub
End Class
 

 

 


다음은 선택 영역을 //로 주석 처리 해 주는 소스입니다.
Imports EnvDTE
Imports EnvDTE80
Imports Microsoft.VisualBasic

Public Class C
	Implements VisualCommanderExt.ICommand

	Sub Run(DTE As EnvDTE80.DTE2, package As Microsoft.VisualStudio.Shell.Package) Implements VisualCommanderExt.ICommand.Run
            Dim win
            win = DTE.ActiveWindow
 
	    If (win.type <> EnvDTE.vsWindowType.vsWindowTypeDocument) And (win.type <> EnvDTE.vsWindowType.vsWindowTypeCodeWindow) Then
           	  MsgBox( "This macro can only be run when a text editor window is active." )
		  Exit Sub
            else
                if InStr( DTE.ActiveDocument.Selection.Text, vbCr ) > 0 then
                    DTE.ActiveDocument.Selection.ReplaceText( "^", "//", EnvDTE.DsTextSearchOptions.dsMatchRegExp )
                End If
            End If
	End Sub

End Class

 

 

 

 

다음은 선택 영역의 //로 된 주석을 해제 해 주는 소스입니다.

Imports EnvDTE
Imports EnvDTE80
Imports Microsoft.VisualBasic

Public Class C
	Implements VisualCommanderExt.ICommand

	Sub Run(DTE As EnvDTE80.DTE2, package As Microsoft.VisualStudio.Shell.Package) Implements VisualCommanderExt.ICommand.Run
		Dim win
		win = DTE.ActiveWindow
	       If (win.type <> EnvDTE.vsWindowType.vsWindowTypeDocument) And (win.type <> EnvDTE.vsWindowType.vsWindowTypeCodeWindow) Then
           	       MsgBox( "This macro can only be run when a text editor window is active." )
		       Exit Sub
              else
			DTE.ActiveDocument.Selection.ReplaceText( "^//", "", EnvDTE.DsTextSearchOptions.dsMatchRegExp )
		End If
		
	End Sub

End Class



출처 : http://blog.naver.com/techshare/220138680455


Windows7 64비트임을 알려드립니다.

다음과 동일한 증상으로 문제가 되시는 분들은 즉각 해결 가능할 것으로 판단됩니다.



제가 사용하는 USB 허브는 기존부터 잘 사용해 왔던 제품으로 어느날 갑자기 아래와 같은 현상을 보이면서 동작을 하지 않는 문제가 발생되었습니다.




장치 관리자에서 USB 2.0 Hub가 제대로 설치가 되지 않아 느낌표가 떠 있으며 장치 분류도 "기타 장치"로 분류 되어있습니다.




장치를 꽂으면 아래와 같이 장치 드라이버 소프트웨어가 제대로 설치 되지 않았다는 메시지를 출력합니다.




위 메시지를 클릭하면 다라이버를 찾을 수 없다고 합니다.





위와 같은 동일한 증상으로 문제가 있는 분들은 아래와 같은 순서를 따라하시면 되겠습니다.



1. C:\Windows\System32\DriverStore\FileRepository\usb.inf_XXXXXXXX    폴더 내 모든 파일 복사하기.

    제 시스템의 경우 "C:\Windows\System32\DriverStore\FileRepository\usb.inf_amd64_neutral_42d7284868af1f40" 위치입니다.

    비슷한 폴더가 3개 있는데 최신 날짜의 폴더를 선택했습니다.


    모든 파일들을 복사합니다.



2. C:\windows\inf 폴더에 몽땅 붙여 넣기



3. 인식 오류가 발생된 장치를 수동으로 삭제합니다.

    => 항목 선택 후 "DEL" 키를 누릅니다.




4. 하드웨어 변경사항 검색을 하면 자동 설치 합니다.




5. 이제 제대로 설치가 되었는지 느낌표가 뜨지 않습니다.

    USB HUB에 USB 저장장치를 꽂았는데 인식을 잘 합니다.



ffdshow가 원래 동영상 인코딩 기능이 있었는데 License 문제로 인해 REV 3671 부터 MPEG4  계열의 인코딩 기능이 모두 제거 되어 릴리즈 되어왔다.

인터넷을 뒤져봤는데 가장 마지막 버전인 REV 3670은 없고 그 버전과 가장 가까운 REV 3665 버전을 공유한다.

FFDSHOW를 이용해서 동영상 인코딩 하는 방법은 인터넷에 널려 있으니 인터넷을 참고하기 바란다.



ffdshow_rev3665_20101212_xhmikosr_icl12.exe









FFDSHOW의 관련 릴리즈 노트

참고 페이지 : http://www.videohelp.com/tools/ffdshow/version-history



이후 생략...


3688
Updated FFmpeg

3687
updated unrar from 3.40 beta4 to 3.93 beta0

3686
Minor changes

3685
silly mistake in MakeAll.bat

3684
update MakeAll.bat, authors, minor cosmetic changes

3683
changed: CinemaScope HD AR should be 2.39, not 2.40

3682
Revert r3678 partially. Fixes the crash when opening the ffdshow video and ffdshow DXVA version details window

Also hide xvidcore.dll and ff_wmv9.dll in the VFW encoder's version window

3681
Updated FFmpeg

3680
Remove x264

3679
Updated FFmpeg

3678
fixed: x64 build errors using binutils >= 2.21.51(thanks to Alexins), other warnings

3677
Remove unused makefiles

3676
small fixes: operator= checks itself, incorrect bool or no return values

3675
update VS2010 project files, move some properties to release.props

3674
disable LTCG for MSVC2010 builds

3673
Updated FFmpeg (disable unused encoders)

3672
installer: use "Japanese.isl" provided with Inno Setup

3671
Disabled some encoders in the VFW interface.
This was agreed upon by the dev team.

The decision whether to completely remove these encoders will be made some time in the future, taking into account the feedback of ffdshow users.

3670
update IS script

3669
applied astyle formatting

3668
move readme files to the src dir, clean up ffdshow.rc

3667
updated vs2010 & icl_12 project files, removed unused template configurations, more linker options configurable using props file

3666
Updated ICL10 projects

3665
clean up ff_acm.rcffvdub.rcmakeAVIS.rc, ff_wmv9.rc

3664
-update Chinese Simplified and Japanese Inno Setup translations
-update ffSpkCfg project and svn ignore
-minor UI change
-add MakeAll.bat back

3663
move licenses in bindistriblicense

3662
Removed some build scripts

3661
applied astyle formatting

3660
applied astyle formatting

3659
applied astyle formatting

3658
applied astyle formatting

3657
update minilzo to v2.04

3656
applied astyle formatting

3655
cosmetics

3654
Remove ICL11 project files

3653
Remove Tremor

3652
delete outdated files when installing ffdshow

3651
Update install script

3650
Rename libavcodec.dll to ffmpeg.dll

3649
update libmpeg2 makefile, remove unneeded file

3648
comment out the donate code



이전 릴리즈 노트 생략...



tstring 클래스는 std::basic_string<> 탬플릿 클리스를 상속받은 클래스이다.

지금까지 std::string이든 std::wstring이든 사용하면서 불편한 점이 바로 CString에는 있는 format()함수가 없다는 것이다.

이를 위해 wsprintf를 사용한다든지 했을텐데 필자 역시 불편하여 이를 위한 유틸리티 함수를 몇 개 만들어본다. 기본 개념은 _snprintf() 라는 함수의 첫번째와 두번째 인자에 NULL과 0을 넣으면 실제 완성된 문자열의 길이를 리턴해 준다.

이 길이를 이용해서 버퍼를 할당하고 완전한 _snprintf() 함수를 호출하여 마무리 한다.

#include "tstring.h"
...
...
void CMFCApplication1Dlg::OnBnClickedButton1()
{
	tstring a;
	std::format(a, _T("aaa : %.3f"), 0.2232487);
	std::append_format(a, _T("==> abc : %s"), _T("mjp") );
	MessageBox(a.c_str());
}

결과는 다음과 같다.



소스파일은 첨부파일에서 다운받으세요.

tstring.7z



액셀에서 매크로는 아주 편리한 기능을 합니다.

거기다 VB 언어로 되어있어 프로그래밍도 가능하죠.

매크로로 2개의 셀을 자동으로 병합해 주는 기능을 만들어볼까 합니다.


아래 그림과 같이 셀이 준비 되어있다고 할때,

기존에는 2개의 셀을 선택한 다음에 마우스 클릭으로 병합을 일일이 해 줘야 하는데요

한, 두개면 상관 없지만 이게 몇 십개 몇 백개라면 문제가 됩니다. 시간이 오래걸리죠.

이 작업을 매크로로 하게 되면 쉽게 처리할 수 있습니다.



우선 매크로를 기록해야 합니다.

보기 탭의 매크로를 눌러보면 메뉴가 나오는데 거기서 매크로 기록을 누르세요.



병합 작업을 쉽게 하기 위해서는 단축키가 필수인데요.

단축키는 알아서 편리한 단축키로 설정하세요.

저는 CTRL+Q로 지정하였습니다.



단축키 지정이 끝나고 확인을 눌렀으면 이제 그냥 매크로 기록 중지하세요.

매크로 내용은 직접 넣을테니까요.



매크로 기록이 중지 되었으니 이제 편집을 해야죠.

편집하기 전에 매크로 보기를 해야 합니다.



매크로 목록이 나오면 "편집" 버튼을 누릅니다.




매크로를 편집할 수 있는 비쥬얼베이직 창이 실행되는데요...

여기다가 아래 코드를 넣으면 끝입니다. 소스는 아래에 있으니 복사해서 붙여넣기 하세요.




소스를 모두 붙여 넣었으면 이제 테스트 해봐야겠죠.

A의 1번 셀을 선택하고 단축키(저는 CTRL+Q)를 눌러봅니다.

아주 잘 실행되서 병합이 한방에 되었습니다.

B번 셀도 해보고, C번 셀도 해봤습니다.

모두 병합되었네요.




아래의 소스코드를 적당하게 복사해서 비쥬얼 베이직프로그램 창(매크로 편집 창)에 붙여넣으세요.


Sub 매크로1()
'
' 매크로1 매크로
'
' 바로 가기 키: Ctrl+q
'
    
    On Error Resume Next
    
    CurRow = ActiveCell.Row
    CurCol = ActiveCell.Column
    
    ' 병합할 셀의 내용을 지워야 확인창이 안뜬다.
    ' 한 셀의 내용이 지워진다라는 내용의 확인창.
    Cells(CurRow + 1, CurCol).Value = ""
    
    ' 현재 셀과 다음 셀을 선택한다.
    Range(Cells(CurRow, CurCol), Cells(CurRow + 1, CurCol)).Select
    
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    Selection.Merge
    
End Sub


이미지 뷰어 많이 사용하실텐데요...

오늘 소개해 드릴 이미지 뷰어 프로그램은 JPEGView라는 오픈소스 프로그램입니다.

UI가 정말 심플하고 이미지만 보입니다. 그리고 정말 빠릅니다. 프로그램 실행속도가 거의 즉각이라 할 수 있습니다.

많이들 사용하시는 알씨 프로그램이 광고도 있고 쓸데없는 기능들이 많아 실행되는 속도가 느리죠.

프로그램 실행속도가 거의 즉각이라 할 수 있습니다.

군더더기 없이 깔끔하고 간단한 이미지 조작 간단하고 최고의 이미지 뷰어라 말할 수 있을 것 같습니다.

물론 개인적으로 선호하는 것이 달라 각자 써 봐야 알겠죠.

이 JPEGView 프로그램을 사용하기 전에는 구글의 Picasa 프로그램의 이미지 뷰어를 사용했었습니다.

Picasa 프로그램의 VIewer 역시 좋은데 필요한 Viewer의 기능을 쓰기 위해 덩치 큰 프로그램을 사용하려고 하니 부담이 된게 사실이었습니다.

그리고 이 프로그램의 장점 중의 하나는 바로 설치가 필요없이 바로 사용할 수 있다는 점이겠죠.


아래와 같이 이미지만 보여주고 ZOOM 하면 오른쪽에 스크롤할 수 있도록 MAP이 보여집니다.

마우스를 움직이면 하단에 버튼들이 보이는데 마우스를 올리면 기능 설명이 나옵니다.




프로그램에서는 기본적인 화질 조절 기능이 지원됩니다. 밝기/대비/음영/Saturation 등등 마우스를 내리면 나옵니다.







우선 본 프로그램을 다운 받으세요.

http://sourceforge.net/projects/jpegview/

아래 사이트의 다운로드가 귀찮으시면 여기 제 블로그에서 바로 다운 받으세요.

JPEGView_1_0_32_1.zip






다운 받으셨으면 압축을 푸세요.





원하는 OS 타입에 따라 해당 폴더를 복사하세요. 32비트 OS의 경우 JPEGView32를 64비트 OS의 경우 JPEGView64를 복사하세요.

저는 32비트 OS라 JPEGView32를 복사합니다.

그리고 Program Files 폴더에 복사를 합니다.





이제 폴더에 들어가서 실행파일 단축 아이콘을 만듭니다.


단축 아이콘을 잘라내기 합니다.

왜냐면 이제 시작메뉴에 올려 놔야죠.

설치 프로그램이 없다보니 이런 작업을 수작업으로 해야하네요. ㅎ


C:\ProgramData\Microsoft\Windows\Start Menu\Programs 


폴더로 이동합니다.

그리고 여기에 붙여넣기를 합니다.



그러면 시작메뉴에 바로가기가 생성됩니다.





이제 이미지를 클릭하면 자동으로 실행되도록 하겟습니다.

우선 JPEGView.exe를 더블클릭해서 실행합니다.

그런 다음 실행되는 대화상자 닫기 하세요. 그러면 심플한 검은색 화면이 나오는데 오른 마우스 누르고 설정/관리 메뉴 들어간 다음 set as default viewer 선택하세요.







여기까지 하셨으면 원하는 확장자를 연결할 수 있도록 대화창이 실행됩니다.

원하는 확장자를 선택한 후 OK 누르면 끝!








빠르고 직감적이고 심플하고 편리하고...

좋네요.

그런데.... PRINT 기능 없네요.. ㅠㅠ 참고하세요.








































현재 웹페이지에 있는 이메일 주소를 모두 가져오는 소스(함수)




function extractEmails (text)
{
    return text.match(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)/gi);
}



function t()
{
	var col = document.getElementsByTagName( 'SPAN' );
	var count = col.length;
	var i = 0, idx_at, idx_start, idx_end;
	var e, str, ret;

	ret = "";

	for( i =0; i < count; i ++ )
	{
		e = col.item(i);
		str = e.innerText;

		idx_at = str.indexOf( '@' );
		if( idx_at > 0 )
		{
			ret = ret + extractEmails(str) + "\n";
		}
	}

	return ret;
}


CScrollView의 윈도우의 ScrollBar는 윈도 개발 초기에 SHORT형 자료형을 기반으로 개발되었기 때문에 scrollbar의 thumb을 잡고 이동할때 32767을 넘는 순간 오동작을 하게 된다.

이 경우 아래와 같이 WM_HSCROLL과 WM_VSCROLL을 핸들링해서 아래 코드를 집어 넣으면 간단히 해결된다.


void CDemoView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	SCROLLINFO si = { 0, }; 
    si.cbSize = sizeof(SCROLLINFO); 
    si.fMask = SIF_ALL; 
    GetScrollInfo(SB_HORZ, &si); 
    nPos = si.nTrackPos; 

	CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CDemoView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	SCROLLINFO si = { 0, }; 
    si.cbSize = sizeof(SCROLLINFO); 
    si.fMask = SIF_ALL; 
    GetScrollInfo(SB_VERT, &si); 
    nPos = si.nTrackPos; 

	CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}


위 방법은 CScrollview를 사용할 때의 이야기고, CScrollBarCtrl 클래스르 직접 사용하거나

혹은, CScrollView가 아닌 다른 View에서 문제를 봉착하였을 경우 GetScrollInfo()함수를 이용하여 적당히 처리하면 해결할 수 있다.


출처 : 아키버드의 블로그 (http://rrss.tistory.com/3)




  0. 구글 드라이브의 장단점
 


장점

- 단일파일 업로드 용량이 자유롭다. 

- 스트리밍이 안정적이다.

- 무료이다.

 구글 드라이브

 M사

 무료 기본 용량 15GB 5GB

  5GB 1개월 이용료 (44,000원)


단점

5GB 라는 용량제한
이용자에 따라 다르게 느껴지겠지만 고화질 영상을 주로 업로드하는 이용자에겐 부족한 용량일 수도 있다. 
하지만 구글은 국내포털에 비해 가입이 자유로워 여러 아이디를 이용하는 방법도 있을 수 있다.

현재는 15GB로 상향조정 되었습니다.


 1. 구글 드라이브 사용법 


구글 드라이브 접속 후 로그인


공유폴더 만들기


1. 좌측 상단에 만들기 버튼을 누르고 폴더를 만든다.


2. 생성된 폴더 좌측 체크박스를 누르고 상단에 공유버튼을 누른다.


3. 비공개로 되어있는 액세스 권한을 수정한다.



업로드 후 링크주소 따기


4. 업로드 버튼을 누르고 jpg로 확장자 변경한 파일을 선택 후 업로드 한다.

(jpg로 확장자를 바꾸지 않은 동영상 파일을 그대로 올릴 경우 일시적으로는 나오지만 시간이 지나면 나오지 않는다.)



5. 파일제목을 Ctrl+클릭하여 새창에 띄운다.

6. 새 창 주소에서 /d/ 부터 /edit 사이에 있는 문자를 복사한다.



7-1. 복사한 문자를 이용해 직접링크를 만든다.

https://www.googledrive.com/host/복사한문자


7-2. 혹은 태그 생성기에 붙여넣기. http://rrss.tistory.com/10

이 경우에는 아래 과정은 볼 필요 없음.


 

 2. 플레이어로 재생하기

 


JW Player (mp4, flv)


티스토리 스킨이나 어디에 올려도 위에서 만든 링크를 가지고 재생할 수 있다.
다만 업로드 확장자를 jpg로 했기 때문에 flashvars에 type=video 혹은 provider=video를 넣어줘야 재생된다.
단점은 태그가 길어 지고 동영상 주소가 태그에 노출된다는 것.

태그 구조

<embed src='JW Player주소' type='application/x-shockwave-flash' width='가로' height='세로' flashvars='file=영상주소&type=video'>

태그 예제
<embed src="http://smarturl.it/jwplayer59" type="application/x-shockwave-flash" width="512" height="384" flashvars="file=https://www.googledrive.com/host/0B3945kzVIO7hb2hrUmJjX250QUE&type=video">

태그 적용


쓰플 커스텀 (flv)


쓰플은 JW Player와 달라서 플레이어 파일도 구글 드라이브에 업로드 해야 재생할 수 있다.

이 경우도 마찬가지로 jpg로 확장자 변경을 해줘야 한다.

쓰플은 단일파일을 위한 플레이어라기보다 티스토리에 10MB로 분할 된 영상을 끊김없이 재생하기 위해 만들어졌기 때문에 단일파일을 재생하는데 알맞지 않을 수 있다. XML을 작성해야하는 번거로움이 있기 때문이다.

쓰플은 소스파일이 공개되어 있으므로 직접 수정해서 단일파일에 적합하게 만들 수도 있지만 능력이 안되거나 귀찮은 분들을 위해서 구글드라이브 재생하는데 적합하게 만들어 놓은 플레이어를 공유한다.

f=복사한문자 명령어를 제외하면 기본 쓰플과 같다. 

완전한 주소를 넣는게 아니라 /host/ 뒤에 문자만 넣으면 된다.


태그 구조 

<embed src='http://smarturl.it/gdplayer' wmode='direct' allowfullscreen='true' type='application/x-shockwave-flash' width='가로' height='세로' flashvars='f=복사한문자'>

태그 예제 

<embed src='http://smarturl.it/gdplayer' wmode='direct' allowfullscreen='true' type='application/x-shockwave-flash' width='512' height='384' flashvars='f=0B3945kzVIO7hb2hrUmJjX250QUE'>


태그 적용



 

 자주 묻는 질문, 추가 정보

 


동영상 확장자를 JPG로 어떻게 바꾸죠?

따로 변환 프로그램을 이용하는게 아니라 이름 바꾸기하면 됩니다.
확장자가 나오지 않으면 탐색기에서 보기 - 폴더옵션 들어가서 보기 탭 누르고 알려진 파일형식의 확장자 숨기기 체크해제하면 됩니다.


SWF 파일 직접링크 가능

swf파일 업로드 시에 jpg로 변경 할 필요가 없음.


동영상이 나오다가 안나와요

두가지 경우가 있습니다.

1. JPG로 변경하지 않고 동영상을 올렸을 때.
2. 트래픽문제로 24시간 다운로드 제한이 걸렸을 때.
과도한 비트레이트의 영상이나 고용량의 영상을 조회수가 높은 곳에 올리면 얄짤 없습니다.
대형 커뮤니티는 유튜브를 이용하세요.

로딩이 너무 길어요

팟 인코더로 MP4 인코딩 했을 경우에 다운로드가 끝까지 다 되고 나서 재생 되기 때문에 발생하는 문제입니다.
ffmpeg을 이용해서 flv로 컨테이너를 바꾸거나 yamb같은 툴을 이용해서 리먹스 해주면 됩니다.




출처 : 아키버드의 블로그 (http://rrss.tistory.com/3)

CPoint/POINT 의 double형 변형체 CdblPoint / dblPOINT

CSize / SIZE 의 double 형 변형체 CdblSize / dblSIZE

CRect / RECT의 double형 변형체 CdblRect / dblRECT



첨부파일 참조




dblPoint.cpp


dblPoint.h


dblRect.cpp


dblRect.h


dblSize.cpp


dblSize.h


+ Recent posts