Winapi

01.03.2012

WinAPI'de metin değerleri sürekli değiştirilen STATIC kontrollerin rengini değiştirme

Yazar: Admin

WinAPI ile oluşturulan bir program içinde tanımlanan ve metin değerlerini sürekli değiştirmek istediğimiz STATIC kontrollerin arka plan rengini etkilemeden metin rengini değiştirmek için STATIC kontrolün bulunduğu pencerenin mesaj işlem fonksiyonu içinde STATIC kontrol tarafından gönderilen mesajlara işlem yapmak gerekir.

Bir STATIC kontrol penceresi çizilirken, içinde bulunduğu ana pencereye WM_CTLCOLORSTATIC mesajı gönderir. Mesajı alan ana pencere mesaj işlem fonksiyonu gelen mesajın wParam parametresinde bulunan STATIC kontrolüne ait device context handle değerini kullanarak STATIC kontrolü metin rengini ayarlayabilir.

İşlemleri gerçekleştirmek için öncelikle aşağıdaki kod satırlarını WinAPI ile oluşturduğunuz kaynak dosyanın başına ekleyelim:


/* STATIC kontrol ID bildirimi */
#define IDC_STATIC01 101

/* STATIC kontrol pencere Handle bildirimi */
HWND hwndStatic01;

STATIC kontrolün içinde bulunduğu pencerenin mesaj işlem fonksiyonuna aşağıdaki kodları ekleyelim:


LRESULT CALLBACK WindowProcedure (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
  HDC hdcStatic01; /* STATIC kontrol HDC bildirimi */
  RECT r1;

  switch (message)
  {
    case WM_CREATE:

       /* STATIC kontrol pencere oluşturma */       
       hwndStatic01 = CreateWindowEx(0, "STATIC", "Static",
                          WS_CHILD | WS_VISIBLE | SS_LEFT, 20, 20, 200, 20,
                          hwnd, (HMENU) IDC_STATIC01, NULL, NULL);

       break;

    case WM_CTLCOLORSTATIC:

       /* Mesaj IDC_STATIC01 kontrolünden geliyorsa */
       if (lParam == (LPARAM)hwndStatic01) {
           hdcStatic01 = (HDC) wParam;
           SetTextColor(hdcStatic01, RGB(255, 0, 0));
           /* Önceki yazıyı silmek için */
           r1.left=0; r1.top=0; r1.right=200; r1.bottom=20;
           /* Ana pencere rengi ile arka planı doldurarak önceki yazıyı silmek için */
           FillRect(hdcStatic01, &r1, GetSysColorBrush(COLOR_3DFACE));  
           SetBkMode(hdcStatic01, TRANSPARENT);

           return (BOOL)GetStockObject(NULL_BRUSH);		   
       }

       break;

       .
       .
       .

Yukarıdaki satırlarla önce, bir STATIC kontrol oluşturulur. WM_CTLCOLORSTATIC mesajı geldiğinde ise IDC_STATIC01 kontrolü ile ilgili mesajlar işlem görür.

Detaylar

Winapi

02.02.2012

WinAPI'de EDIT kontrolünün arka plan rengini değiştirme

Yazar: Admin

WinAPI ile oluşturulan bir program içinde tanımlanan EDIT kontrollerinin arka plan renklerini değiştirmek için EDIT kontrolünün bulunduğu pencerenin mesaj işlem fonksiyonu içinde EDIT kontrolü tarafından gönderilen mesajlara işlem yapmak gerekir.

Bir EDIT kontrolü penceresi çizilirken, eğer EDIT kontrolü sadece okunur durumda veya devre dışı kalmış ise, içinde bulunduğu ana pencereye WM_CTLCOLORSTATIC mesajı, aksi takdirde WM_CTLCOLOREDIT mesajı gönderir. Mesajı alan ana pencere mesaj işlem fonksiyonu gelen mesajın wParam parametresinde bulunan EDIT kontrolüne ait device context handle değerini kullanarak EDIT kontrolü metin ve arka plan rengini ayarlayabilir.

WM_CTLCOLORSTATIC : EDIT kontrolü sadece okunur durumda veya devre dışı kalmış ise gönderilir.

WM_CTLCOLOREDIT : EDIT kontrolü sadece okunur durumda veya devre dışı kalmış değil ise gönderilir.

İşlemleri gerçekleştirmek için öncelikle aşağıdaki kod satırlarını WinAPI ile oluşturduğunuz kaynak dosyanın başına ekleyelim:


/* EDIT kontrol ID bildirimleri */
#define IDC_EDIT01 101
#define IDC_EDIT02 102

/* EDIT kontrolü pencere Handle bildirimleri */
HWND hwndEdit01, hwndEdit02;

EDIT kontrolünün içinde bulunduğu pencerenin mesaj işlem fonksiyonuna aşağıdaki kodları ekleyelim:


LRESULT CALLBACK WindowProcedure (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
  HDC hdcEdit01, hdcEdit02; /* EDIT kontrol HDC bildirimleri */
  static HBRUSH hbrBkgnd01=NULL, hbrBkgnd02=NULL; /* EDIT kontrol BRUSH bildirimleri */

  switch (message)
  {
    case WM_CREATE:

       /* EDIT kontrol pencere oluşturma */       
       hwndEdit01 = CreateWindowEx(0, "EDIT", "Edit01",
                             WS_CHILD | WS_VISIBLE | WS_BORDER, 20, 20, 200, 20,
                             hwnd, (HMENU) IDC_EDIT01, NULL, NULL);

       hwndEdit02 = CreateWindowEx(0, "EDIT", "Edit02",
                             WS_CHILD | WS_VISIBLE | WS_BORDER, 20, 50, 200, 20,
                             hwnd, (HMENU) IDC_EDIT02, NULL, NULL);

       /* IDC_EDIT02 kontrolüne sadece okunur özelliği verilmesi */
       SendMessage(hwndEdit02, EM_SETREADONLY, (WPARAM)TRUE, 0);

       break;

    case WM_CTLCOLOREDIT:

       /*if (GetDlgCtrlID((HWND)lParam) == IDC_EDIT01) { Alternatif yöntem */
       /* Mesaj IDC_EDIT01 kontrolünden geliyorsa */
       if (lParam == (LPARAM)hwndEdit01) {
           hdcEdit01 = (HDC) wParam;
           SetTextColor(hdcEdit01, RGB(0, 0, 0));
           SetBkColor(hdcEdit01, RGB(206, 206, 255));

           if (hbrBkgnd01 == NULL) {
               hbrBkgnd01 = CreateSolidBrush(RGB(206, 206, 255));
           }
           return (INT_PTR)hbrBkgnd01;
       }

    case WM_CTLCOLORSTATIC:

       /*if (GetDlgCtrlID((HWND)lParam) == IDC_EDIT02) { Alternatif yöntem */
       /* Mesaj IDC_EDIT02 kontrolünden geliyorsa */
       if (lParam == (LPARAM)hwndEdit02) {
           hdcEdit02 = (HDC) wParam;
           SetTextColor(hdcEdit02, RGB(0, 0, 0));
           SetBkColor(hdcEdit02, RGB(206, 206, 255));

           if (hbrBkgnd02 == NULL) {
               hbrBkgnd02 = CreateSolidBrush(RGB(206, 206, 255));
           }
           return (INT_PTR)hbrBkgnd02;
       }

       break;

       .
       .
       .

Yukarıdaki satırlarla önce, iki adet EDIT kontrolü oluşturulur. Sonra, SendMessage() fonksiyonu EM_SETREADONLY mesajı gönderilerek IDC_EDIT02 kontrolüne sadece okunur özelliği verilir. WM_CTLCOLOREDIT mesajı geldiğinde IDC_EDIT01 kontrolü ve WM_CTLCOLORSTATIC mesajı geldiğinde ise IDC_EDIT02 kontrolü ile ilgili mesajlar işlem görür.

Detaylar

Winapi

01.02.2012

WinAPI'de Subclassing yöntemi ile EDIT kontrolünde girilen karakterlerin sınırlanması

Yazar: Admin

WinAPI ile oluşturulan bir program içinde tanımlanan EDIT kontrolleri için bir mesaj işlem fonksiyonu oluşturarak subclassing yöntemi kullanmak suretiyle, bazı karakterlerin girilmesini engelleyebilirsiniz.

Eğer bir kontrolde bulunan özellikleri değiştirmek veya yeni özellikler eklemek için subclassing yöntemini kullanabilirsiniz.

Bu yöntemde, bir kontrolün içinde yer aldığı pencere mesaj işlem fonksiyonu yerine yeni bir bir mesaj işlem fonksiyonu tanımlanır. Fonksiyon tanımlaması yapıldıktan sonra, EDIT penceresine gelen mesajlar ilk önce bu fonksiyona gelir. Bu fonsiyonda gelen mesajlara bir işlem yapılır veya direk olarak ana pencereye gönderilir. EDIT kontrolünün mesaj işlem fonksiyonunu değiştirmek için SetWindowLong() veya SetWindowLongPtr() fonksiyonu kullanılır.

Öncelikle aşağıdaki kod satırlarını WinAPI ile oluşturduğunuz kaynak dosyanın başına ekleyin:


/* EDIT kontrolü ID bildirimi */
#define IDC_EDIT 101
/* EDIT kontrolü pencere Handle değeri bildirimi */
HWND hwndEdit;
/* EDIT kontrolünün bulunduğu pencere mesaj işlem fonksiyonunun atandığı değer */
WNDPROC PrevEditProc; 
/* EDIT kontrolü için oluşturulan yeni mesaj işlem fonksiyonunun bildirimi */
LRESULT CALLBACK EditNewProc (HWND, UINT, WPARAM, LPARAM);

EDIT kontrolünün içinde bulunduğu pencerenin mesaj işlem fonksiyonuna aşağıdaki kodları ekleyin:


LRESULT CALLBACK WindowProcedure (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
  switch (message)
  {
    case WM_CREATE:
       
       hwndEdit = CreateWindowEx(0, "EDIT", "",
                             WS_CHILD | WS_VISIBLE | WS_BORDER, 20, 20, 100, 20,
                             hwnd, (HENU)IDC_EDIT, NULL, NULL);

       PrevEditProc = (WNDPROC)SetWindowLong(hwndEdit, GWL_WNDPROC, (LONG)EditNewProc);
       .
       .
       .
	   

Yukarıdaki satırlarla önce, bir EDIT kontrolü oluşturulur. Sonra, SetWindowLong() fonksiyonu GWL_WNDPROC parametresi ile kullanılarak EDIT kontrolünün mesaj işlem fonksiyonu değiştirilir.

WinAPI ile oluşturduğunuz kaynak dosyasının sonuna aşağıdaki satırları ekleyin:


/* EDIT kontrolünün yeni mesaj işlem fonksiyonu */
/* EDIT kontrolünün yeni mesaj işlem fonksiyonu */
LRESULT CALLBACK EditNewProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  switch (message)
  {
     case WM_CHAR:
        /* Rakam, '.' veya BACKSPACE tuşlarına basılırsa, mesaj işlem görür
        ve 0 değeri döndürülür. */
        if ((wParam<48 || wParam>57) && (wParam!='.' && wParam!=8)) return 0;
        break;
  }
  
  /* Ana pencere mesaj işlem fonksiyonu çağrılır ve mesaj işlem görmeden aktarılır. */
  return CallWindowProc (PrevEditProc, hwnd, message, wParam, lParam);
}

Yukarıdaki fonksiyon tanımlandıktan sonra EDIT kontrolüne gelen tüm mesajlara öncelikle burada işlem yapılır.

TranslateMessage() fonksiyonu WM_KEYDOWN mesajına işlem yaptığında, WM_CHAR mesajını klavyenin aktif olduğu pencereye gönderir. WM_CHAR mesajının wParam parametresi basılan tuşun karakter kodunu içerir.

Eğer rakam, '.' veya BACKSPACE tuşuna basılırsa, mesaj işlem görür ve 0 değeri döndürülür. Eğer, koşul sağlanmazsa, mesaja işlem yapılmaz ve CallWindowProc() fonksiyonu çağrılarak mesaj ana pencere mesaj işlem fonksiyonuna gönderilir.

Programınızı derleyip çalıştırdığınızda, EDIT kontrolü içinde sadece rakam, '.' işareti ve BACKSPACE tuşları ile giriş yapabileceksiniz.

Detaylar

Winapi

27.01.2012

WinAPI'de TAB tuşu ile kontroller arasında geçiş

Yazar: Admin

WinAPI'de TAB tuşu ile ana pencere ve diğer pencerelerde yer alan kontroller arasında geçiş sağlamak için, kullanıcı tarafından bir pencere oluşturulurken CreateWindowEx() fonksiyonunun 1 nci parametresi olan dwExStyle parametresi WS_EX_CONTROLPARENT değeri, kontroller oluşturulurken CreateWindowEx() fonksiyonunun 4 ncü parametresi olan dwStyle parametresi WS_TABSTOP değeri alır.

Ayrıca, kullanıcı tarafından oluşturulan pencere ve kontroller arasında TAB tuşu ile geçiş sağlanması için, program ana mesaj döngüsünde IsDialogMessage() mesajının çağrılması gerektiğinden, program ana mesaj döngüsü aşağıdaki şekilde olmalıdır:


while (GetMessage (&messages, NULL, 0, 0) > 0) {
   if (!IsWindow(hwndMain) || !IsDialogMessage(hwndMain, &messages)) {
       TranslateMessage(&messages);
       DispatchMessage(&messages);
   }
}

Bir progam ana penceresinde oluşturulan 4 adet EDIT kontrolü ile kullanıcı tarafından oluşturulan bir panelde bulunan 2 adet EDIT kontrolü arasında TAB tuşu ile geçiş sağlayan program kodları aşağıdadır:


#include <windows.h>

#define IDC_EDIT01 101
#define IDC_EDIT02 102
#define IDC_EDIT03 103
#define IDC_EDIT04 104
#define IDC_EDIT05 105
#define IDC_EDIT06 106

#define IDC_PANEL 201

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK PanelProc (HWND, UINT, WPARAM, LPARAM);
BOOL CreatePanel (HWND);

char szClassName[ ] = "WinAPIWindowsApp";
HINSTANCE ghInst;

HWND hwndEdit01, hwndEdit02, hwndEdit03, hwndEdit04;
HWND hwndPanel;
HWND hwndEdit01Panel, hwndEdit02Panel;

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nCmdShow)
{
  HWND hwndMain;
  MSG messages;
  WNDCLASSEX wincl;

  ghInst = hThisInstance;

  wincl.hInstance = hThisInstance;
  wincl.lpszClassName = szClassName;
  wincl.lpfnWndProc = WindowProcedure;
  wincl.style = CS_DBLCLKS;
  wincl.cbSize = sizeof (WNDCLASSEX);

  wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
  wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
  wincl.lpszMenuName = NULL;
  wincl.cbClsExtra = 0;
  wincl.cbWndExtra = 0;
  wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

  if (!RegisterClassEx (&wincl)) return 0;

  hwndMain = CreateWindowEx (0, szClassName, "WinAPI Temel Program", 
                 WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 
                 600, 400, HWND_DESKTOP, NULL, hThisInstance, NULL);

  if (!hwndMain) return 0;

  ShowWindow (hwndMain, nCmdShow);
  UpdateWindow(hwndMain);

  while (GetMessage (&messages, NULL, 0, 0) > 0) {
     if (!IsWindow(hwndMain) || !IsDialogMessage(hwndMain, &messages)) {
         TranslateMessage(&messages);
         DispatchMessage(&messages);
     }
  }
  return messages.wParam;
}

LRESULT CALLBACK WindowProcedure (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
  switch (message)
  {
    case WM_CREATE:
       hwndEdit01 = CreateWindowEx(0, "EDIT", "Edit01",
                        WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 20, 20, 200, 20,
                        hwnd, (HMENU) IDC_EDIT01, NULL, NULL);

       hwndEdit02 = CreateWindowEx(0, "EDIT", "Edit02",
                        WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 20, 50, 200, 20,
                        hwnd, (HMENU) IDC_EDIT02, NULL, NULL);

       hwndEdit03 = CreateWindowEx(0, "EDIT", "Edit03",
                        WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 20, 80, 200, 20,
                        hwnd, (HMENU) IDC_EDIT03, NULL, NULL);

       hwndEdit04 = CreateWindowEx(0, "EDIT", "Edit04",
                        WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 20, 110, 200, 20,
                        hwnd, (HMENU) IDC_EDIT04, NULL, NULL);

       if (CreatePanel (hwnd)) {
           hwndEdit01Panel = CreateWindowEx(0, "EDIT", "Edit01Panel",
                        WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 20, 20, 200, 20,
                        hwndPanel, (HMENU) IDC_EDIT05, NULL, NULL);

           hwndEdit02Panel = CreateWindowEx(0, "EDIT", "Edit02Panel",
                        WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 20, 50, 200, 20,
                        hwndPanel, (HMENU) IDC_EDIT06, NULL, NULL);
       }

       break;

    case WM_DESTROY:
       PostQuitMessage (0);
       break;

    default:
         return DefWindowProc (hwnd, message, wParam, lParam);
  }

  return 0;
}

BOOL CreatePanel (HWND hwndParent)
{
  WNDCLASSEX winpan01 = {0};
  winpan01.cbSize = sizeof (WNDCLASSEX);
  winpan01.lpszClassName = TEXT("Panel");
  winpan01.lpfnWndProc = PanelProc;
  winpan01.hCursor = LoadCursor (NULL, IDC_ARROW);
  winpan01.cbClsExtra = 0;
  winpan01.cbWndExtra = 0;
  winpan01.hbrBackground = GetSysColorBrush(COLOR_3DFACE);

  if (!RegisterClassEx (&winpan01)) return 0;

  hwndPanel = CreateWindowEx (WS_EX_CONTROLPARENT, winpan01.lpszClassName, NULL,
                  WS_CHILD | WS_VISIBLE, 260, 20, 250, 200,
                  hwndParent, (HMENU) IDC_PANEL, ghInst, NULL);

  return 1;
}

LRESULT CALLBACK PanelProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  switch(message)
  {
    case WM_CREATE:
    {

        break;
    }
  }
  return DefWindowProc (hwnd, message, wParam, lParam);
}

Detaylar

Mysql

26.01.2012

WampServer üzerinde phpMyAdmin Hatası

Yazar: Admin

WampServer sunucu üzerinde phpMyAdmin programına girmek istediğinizde aşağıdaki hatayı verdiğinde:

phpMyAdmin - Hata

Oturum hatasız olarak başlatılamıyor, lütfen PHP ve/veya web sunucusu günlüğü dosyanızda verilen hataları kontrol edin ve PHP kurulumunuzu düzgün olarak yapılandırın.

Eğer bu hata her şey yolunda giderken ve belirgin herhangi bir sebep yok iken meydana gelmişse, bilgisayarınızda yüklü güvenlik duvarı güvenlik seviyesini en düşük seviyeye indirin.

Sorunu hallettikten sonra güvenlik duvarı ayarlarını önceki haline getirebilirsiniz.

Detaylar

Mysql

22.01.2012

MySQL Server Windows kurulumunda veritabanı klasörü

Yazar: Admin

Windows işletim sistemleri için MySQL installer paketini indirerek kurduğunuzda, MySQL Server'ın veritabanı dosyalarını sakladığı klasör Windows işletim sisteminin sürümüne göre değişmektedir.

Veritabanının yer aldığı klasörler aşağıda gösterilmektedir:

Windows XP, Windows Server 2003

C:\\Documents and Settings\\All Users\\Application Data\MySQL\\MySQL Server 5.5\\data

Windows Vista

C:\\Users\\All Users\\MySQL\\MySQL Server 5.5\\data

Windows 7, Windows Server 2008

C:\\ProgramData\\MySQL\\MySQL Server 5.5\\data

Detaylar

Php

17.10.2011

PHP ile web sitesi RSS içeriklerini okuma

Yazar: Admin

PHP kodları ile direk olarak bir web sitesinin RSS içeriğini okuyabilirsiniz.


<html>
<body>

<?php

function getRSS($xml) 
{
    $xmlDoc = new DOMDocument();   
   
    if ($xmlDoc->load($xml)) { 

        $x=$xmlDoc->getElementsByTagName('item');

        for ($i=0; $i<$x->length; $i++) {
             // Burada sadece 2 veri alanı okutulmaktadır.
             $link = $x->item($i)->getElementsByTagName('link')->item(0)
                     ->childNodes->item(0)->nodeValue;
             $title = $x->item($i)->getElementsByTagName('title')->item(0)
                      ->childNodes->item(0)->nodeValue;
			    
             // Okunan değerler UTF-8 ise Türkçe karaktere çevirmek için
             $title =  iconv("UTF-8", "ISO-8859-9", $title);
				
             if ($i==0) {
                 echo ('');
    }
}
   
// RSS verileri içeren .xml uzantılı dosya adı veya dosyanın bulunduğu dizin adı
// yazılabilir.
getRSS("http://www...rss.xml");;

?>

</body>
</html>

Detaylar

Php

15.10.2011

MySQL dosyasından okunan tarih formatını değiştirme

Yazar: Admin

MySQL dosyasından okuduğunuz tarih değerlerini farklı şekillerde yazmak için 2 farklı yöntem kullanabilirsiniz.

MySQL komut satırında DATE_FORMAT() fonksiyonunu kullanarak veya SQL dosyasından tarih değerini okuduktan sonra PHP komutları ile tarih değerlerini istediğiniz yapıda şekillendirebilirsiniz:


<?php
    // MySQL DATE_FORMAT() fonksiyonu yoluyla tarih değerini gg.aa.yyyy formatında okur
    $q = "SELECT *, DATE_FORMAT(tarih, '%d.%m.%Y') As tarih_tr FROM tablo_adi";

    $r = mysql_query($q);

    while (($row = mysql_fetch_array($r))) {
        $tarih = stripslashes($row['tarih_tr']);

        echo "$tarih
"; } ?>

<?php
    // PHP komutları yoluyla
    $q = "SELECT * FROM tablo_adi ORDER BY tarih DESC";

    $r = mysql_query($q);

    while (($row = mysql_fetch_array($r))) {
        $tarih = stripslashes($row['tarih']);

        // Tarih değerini gg.aa.yyyy formatına çevirerek ekrana yazar.
        echo date('d.n.Y', strtotime($tarih)) . '
'; } ?>

Detaylar