Snippets

From SpenchWiki
Jump to: navigation, search
  • Use !! to ensure that any overloaded operators used to evaluate an expression do NOT end up at operator ||
  • Invalid Window filename chars
/ \ : ? * " < > |
  • Change default file mode
#include "stdlib.h"
#include <fcntl.h>

/*extern "C" int */_fmode = _O_WTEXT;
_fmode = _O_BINARY;
  • fopen 'fmode': ANSI, UTF-8, UTF-16LE, and UNICODE
",ccs=UNICODE"
#include <fcntl.h>
_O_TEXT, _O_BINARY, _O_WTEXT, _O_U16TEXT, _O_U8TEXT
  • Unicode in text files (auto-read in fopen.c)
UTF-16 BOM: FF FE
UTF-8 BOM: ? ? ?
"\r\n" (0x0D, 0x0A) (CRLF)
  • MFC filecore.cpp helpers
AfxGetModuleShortFileName
AfxGetFileTitle
AfxComparePath
AfxGetRoot
AfxFullPath
AfxResolveShortcut
AfxGetInProcServer
AfxStringFromCLSID
AFX_COM::CreateInstance
AFX_COM::GetClassObject
  • Keydown detection
(GetAsyncKeyState(VK_SHIFT) & (1 << 15))
  • CTreeCtrl hit-test
void OnNMClickTreeDirectories(NMHDR *pNMHDR, LRESULT *pResult)
{
	CPoint point;
	GetCursorPos(&point);
	UINT nFlags;

	m_cntrlTree_Dirs.ScreenToClient(&point);

	HTREEITEM hItem = m_cntrlTree_Dirs.HitTest(point, &nFlags);

	if (nFlags & TVHT_ONITEMSTATEICON)
	{
		m_cntrlTree_Dirs.GetItemData(hItem);
	}
}
  • TrackPopupMenu
CMenu menu;
menu.LoadMenu(MAKEINTRESOURCE(IDR_MENU));

CMenu* pMenu = menu.GetSubMenu(2);
ASSERT(pMenu);

CPoint point;
::GetCursorPos(&point);
pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, point.x, point.y, this);
  • WM_COMMAND

wParam

The high-order word specifies the notification code if the message is from a control. If the message is from an accelerator, this value is 1. If the message is from a menu, this value is zero. The low-order word specifies the identifier of the menu item, control, or accelerator.

lParam

Handle to the control sending the message if the message is from a control. Otherwise, this parameter is NULL.

  • TN020: ID Naming and Numbering Conventions
    • By convention, the ID value of 0 is not used.
    • Windows implementation limitations restrict true resource IDs to be less than or equal to 0x7FFF.
    • MFC's internal framework implementations reserve several ranges: 0xE000->0xEFFF and 0x7000->0x7FFF.
    • Several Windows system commands use the range of 0xF000 -> 0xFFFF.
    • Control IDs of 1->7 are reserved by IDOK, IDCANCEL, and so on.
    • The range of 0x8000->0xFFFF for strings is reserved for menu prompts for commands.
SHAutoComplete(hwndEdit, dwFlags);
  • Menu utilities
GetMenuPosFromID
  • Shell Colour utilities
ColorAdjustLuma
ColorHLSToRGB
ColorRGBToHLS
  • _CrtSetDebugFillThreshold
  • File Management Functions
GetBinaryType
SHGetFileInfo
  • Thread naming
typedef struct tagTHREADNAME_INFO
{
    DWORD dwType;     // must be 0x1000
    LPCSTR szName;    // pointer to name (in user address space)
    DWORD dwThreadID; // thread ID (-1 = caller thread)
    DWORD dwFlags;    // reserved for future use, must be zero
} THREADNAME_INFO;

void SetThreadName( DWORD dwThreadID, LPCSTR szThreadName )
{
    THREADNAME_INFO info;
    info.dwType = 0x1000;
    info.szName = szThreadName;
    info.dwThreadID = dwThreadID;
    info.dwFlags = 0;

    __try
    {
        RaiseException( 0x406D1388, 0,
                    sizeof(info) / sizeof(DWORD),
		    (DWORD*)&info );
    }
    __except( EXCEPTION_CONTINUE_EXECUTION ) {
    }
}

// Example usage:
SetThreadName(-1, "Main thread");
  • Creating a crash dump
#include <dbghelp.h>
#include <shellapi.h>
#include <shlobj.h>

int GenerateDump(EXCEPTION_POINTERS* pExceptionPointers)
{
    BOOL bMiniDumpSuccessful;
    WCHAR szPath[MAX_PATH]; 
    WCHAR szFileName[MAX_PATH]; 
    WCHAR* szAppName = L"AppName";
    WCHAR* szVersion = L"v1.0";
    DWORD dwBufferSize = MAX_PATH;
    HANDLE hDumpFile;
    SYSTEMTIME stLocalTime;
    MINIDUMP_EXCEPTION_INFORMATION ExpParam;

    GetLocalTime( &stLocalTime );
    GetTempPath( dwBufferSize, szPath );

    StringCchPrintf( szFileName, MAX_PATH, L"%s%s", szPath, szAppName );
    CreateDirectory( szFileName, NULL );

    StringCchPrintf( szFileName, MAX_PATH, L"%s%s\\%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp", 
               szPath, szAppName, szVersion, 
               stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay, 
               stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond, 
               GetCurrentProcessId(), GetCurrentThreadId());
    hDumpFile = CreateFile(szFileName, GENERIC_READ|GENERIC_WRITE, 
                FILE_SHARE_WRITE|FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);

    ExpParam.ThreadId = GetCurrentThreadId();
    ExpParam.ExceptionPointers = pExceptionPointers;
    ExpParam.ClientPointers = TRUE;

    bMiniDumpSuccessful = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), 
                    hDumpFile, MiniDumpWithDataSegs, &ExpParam, NULL, NULL);

    return EXCEPTION_EXECUTE_HANDLER;
}

void SomeFunction()
{
    __try
    {
        int *pBadPtr = NULL;
        *pBadPtr = 0;
    }
    __except(GenerateDump(GetExceptionInformation()))
    {
    }
}
  • Wildcard comparison
int wildcmp(const char *wild, const char *string) {
  // Written by Jack Handy - jakkhandy@hotmail.com

  const char *cp = NULL, *mp = NULL;

  while ((*string) && (*wild != '*')) {
    if ((*wild != *string) && (*wild != '?')) {
      return 0;
    }
    wild++;
    string++;
  }

  while (*string) {
    if (*wild == '*') {
      if (!*++wild) {
        return 1;
      }
      mp = wild;
      cp = string+1;
    } else if ((*wild == *string) || (*wild == '?')) {
      wild++;
      string++;
    } else {
      wild = mp;
      string = cp++;
    }
  }

  while (*wild == '*') {
    wild++;
  }
  return !*wild;
}
  • Reading hexidecimal
_tcstoul(str, ?, radix)
  • gluUnProject
CVector3 GetOGLPos(int x, int y)
{
	GLint viewport[4];
	GLdouble modelview[16];
	GLdouble projection[16];
	GLfloat winX, winY, winZ;
	GLdouble posX, posY, posZ;

	glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
	glGetDoublev( GL_PROJECTION_MATRIX, projection );
	glGetIntegerv( GL_VIEWPORT, viewport );

	winX = (float)x;
	winY = (float)viewport[3] - (float)y;
	glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );

	gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);

	return CVector3(posX, posY, posZ);
}
  • Time format

%d/%m/%Y %H:%M:%S

  • Float format
%.*g

If the precision specification is an asterisk (*), an int argument from the argument list supplies the value. The precision argument must precede the value being formatted in the argument list.

  • Conditional include

The __if_exists and __if_not_exists statements allow you to conditionally include code depending on the existence of a symbol.

  • ChildWindowFromPoint
HWND AFXAPI _AfxChildWindowFromPoint(HWND hWnd, POINT pt)
{
	ASSERT(hWnd != NULL);

	// check child windows
	::ClientToScreen(hWnd, &pt);
	HWND hWndChild = ::GetWindow(hWnd, GW_CHILD);
	for (; hWndChild != NULL; hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT))
	{
		if (_AfxGetDlgCtrlID(hWndChild) != (WORD)0 &&
			(::GetWindowLong(hWndChild, GWL_STYLE) & WS_VISIBLE))
		{
			// see if point hits the child window
			CRect rect;
			::GetWindowRect(hWndChild, rect);
			if (rect.PtInRect(pt))
				return hWndChild;
		}
	}

	return NULL;    // not found
}
  • Struct-array initialisation
AFX_STATIC_DATA CRITICAL_SECTION _afxResourceLock[CRIT_MAX] = { { 0 } };
  • MFC-TLS <afxtls_.h>
CSimpleList
CTypedSimpleList
CThreadSlotData
CNoTrackObject
CProcessLocalObject
CThreadLocal<TYPE>::GetData
CProcessLocal<TYPE>::GetData
  • Adjusting CRT SxS version:
/***
*crtassem.h - Libraries Assembly information
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       This file has information about Libraries Assembly version.
*
*       [Public]
*
****/

#pragma once

#ifndef _VC_ASSEMBLY_PUBLICKEYTOKEN
#define _VC_ASSEMBLY_PUBLICKEYTOKEN "1fc8b3b9a1e18e3b"
#endif

#ifndef _CRT_ASSEMBLY_VERSION
#if defined _USE_RTM_VERSION
#define _CRT_ASSEMBLY_VERSION "8.0.50608.0"
#else
#define _CRT_ASSEMBLY_VERSION "8.0.50727.762"
#endif
#endif

#ifndef __LIBRARIES_ASSEMBLY_NAME_PREFIX
#define __LIBRARIES_ASSEMBLY_NAME_PREFIX "Microsoft.VC80"
#endif