понедельник, 30 марта 2009 г.

Tips & tricks WinForms .NET 2

Перемещение окна за любое место

  1. const int WM_NCHITTEST = 0x84;   
  2. const int HTCAPTION = 2;   
  3. const int HTCLIENT = 1;   
  4.    
  5. protected override void WndProc(ref Message m)   
  6. {   
  7.        base.WndProc(ref m);   
  8.    
  9.        if (m.Msg == WM_NCHITTEST && (int)m.Result == HTCLIENT)   
  10.            m.Result = (IntPtr)HTCAPTION;   
  11. }  

вторник, 10 марта 2009 г.

Shell COM для Window x64

Много программ хорошо работает как под x32 так и под x64 виндами. Но есть то что не будет работать - это расширения для Shell x64 винды, написаные для x32 ( можно зарегать под x32 проводник, но этот путь не для настоящих джедаев ).

Создать расширение для оболочки Windows x64, оказывается на поверку тривиальной задачей.

Для начала понадобится компилятор x64 - в VS2008 уже включен.

Compiling 64 bit DLL/EXE

1. Open your Visual C++ Solution
2. Choose Build->Configuration Manager menu
3. Inside the Configuration Manager window, change the ‘Active solution platform’ to x64. If you don’t have any, you would need to create one by selecting the ‘New..’ drop down item. Copy settings from your Win32 platform.
4. Now rebuild your solution.

Если возникли ошибки связаные с типами, меняем : INT_PTR <- int. DWORD_PTR <- DWORD.
Специфичный код обрамляем в соотвествующие макросы _WIN64 и _WIN32.

Регистрация осуществляется с помощью : C:\Windows\System32\regsvr32.exe (64 bit)
Для висты требуются админские права.

вторник, 6 января 2009 г.

Восстановление устройства в DirectX

Немного кода...

  1. HRESULT hr = m_pD3DDevice->TestCooperativeLevel ();    
  2.    
  3. // c девайсом пока ничего не случилось   
  4. if ( false == m_bDeviceLost )   
  5. {   
  6.         if ( hr == D3DERR_DEVICELOST )   
  7.         {       // произошли проблемы   
  8.                 m_bDeviceLost = true;   
  9.    
  10.                 OnLostDevice();     
  11.         }   
  12. }   
  13.    
  14. // если девайс не сбросили надо его сбросить    
  15. if ( hr == D3DERR_DEVICENOTRESET )         
  16. {   
  17.         hr = m_pD3DDevice->Reset ( &m_d3dpp );     
  18.    
  19.         if ( hr == D3D_OK )   
  20.         {   
  21.                 OnResetDevice();           
  22.    
  23.                 // девайс в порядке   
  24.                 m_bDeviceLost = false;   
  25.         }   
  26.         else   
  27.                 if ( hr == D3DERR_DEVICELOST )    
  28.                 {   
  29.                         // произошли проблемы   
  30.                         m_bDeviceLost = true;      
  31.    
  32.                         OnLostDevice();   
  33.                 }   
  34. }  


Этот код достаточно вставить перед вызовом BeginScene для девайса.

OnLostDevice - релизим все ресурсы которые с типом D3DPOOL_DEFAULT,
OnResetDevice - аналогично пересоздаем все ресурсы с типом D3DPOOL_DEFAULT, для всех ID3DX интерфейсов вызываем соответствующие методы.

Если у вас происходит ресайз окна достаточно вызвать последовательность методов
OnLostDevice, затем Reset девайсу, OnResetDevice.

Mожно вставить проверки на возвращаемые значения для BeginScene (), EndScene (), Present ().

www.epicreal.com

понедельник, 5 января 2009 г.

"Open source" от microsoft

В последнее время озаботился тулзами и всякими либами для .NET (бесплатные и желательно с открытыми сорцами). Вот те на http://www.codeplex.com/ - чудо сайт "CodePlex is Microsoft's open source project hosting web site. Start a new project, join an existing one, or download software created by the community." - описание с сайта подняло настроение.

http://www.codeplex.com/ScintillaNET ( контрольчик для подсветки синтаксиса, для тех кто из тундры или с другой планеты ) - эта тулза так вапще находка для токаря. Ковыряние с исходниками и написание своего маленького теста (посветка кода lua, xml), мое настроение улетело в горы ! Все работает как часики.