2012-03-15 50 views
0

別のウィンドウにまたがってテキストを重ねて印刷する機能を作っていました。別のスレッドに入れたいので、離れるときにテキストを表示するタイマーを実行できますユーザーはプログラムを使用し続けます。私は、コンパイル時にしかし、私はこのエラーを取得する:_beginthreadexは 'overloaded-function'から変換できません

#include "stdafx.h" 
#include "Trial.h" 

int main() 
{ 
wchar_t* text = L"Message!"; 
HWND hwnd = FindWindowW(0, L"Halo"); 
unsigned threadID; 
_beginthreadex(0, 0, DrawText,(void *)(hwnd, 175, 15, text, 8), 0 , &threadID); 
// Other function here 
} 

そしてここにヘッダファイルTrial.hです::(それは少しずさんだが、正常に動作しますが、以来、ここ

error C2664: '_beginthreadex' : cannot convert parameter 3 from 'overloaded-function' to 'unsigned int (__stdcall *)(void *)' 

は、メインのCPPファイルですほとんどのモニターは約2msのアップデートです、スリープ(2)はちらつきを防ぐのに役立ちます)。私は複数の例を挙げて見てきた

#pragma once  
#include <Windows.h> 
#include <string> 
#include <process.h> 

void DrawText(HWND hWnd, float x, float y, wchar_t* mybuffer, float DisplayTime) 
{ 
SetForegroundWindow(hWnd); 
HDC hdc = GetDC(hWnd); 
SetBkColor(hdc,RGB(255, 255, 255));     // While Background color... 
SetBkMode(hdc, TRANSPARENT);      // Set background to transparent so we don't see the white... 

int howmany = sizeof(mybuffer) * 2; 

DisplayTime *= 500; 
int p = 0; 
while(p < DisplayTime) 
{ 
      // Shadow Offset 
    SetTextColor(hdc,RGB(0, 0, 0)); 
    TextOut(hdc,x+2,y+2, (LPCWSTR)mybuffer,howmany); 

    // Primary text 
    SetTextColor(hdc,RGB(255, 0, 0)); 
    TextOutW(hdc,x,y,(LPCWSTR)mybuffer,howmany); 

    UpdateWindow(hWnd); 
    p++; 
    Sleep(2); 
} 
ReleaseDC(hWnd,hdc); 
_endthreadex(0); 
} 

は、構文をチェックし、私は_beginthreadexに混乱をしなかったことを確認しましたが、問題の原因を見つけるように見えることはできません。|

答えて

2

スタートアップ関数は、使用したものではなく、正確なプロトタイプに従う必要があります。

単一のvoid *を取る関数を受け入れることができます。

いくつかの解決策があります。

  1. void *を受け入れるように関数を変更します。すぐにあなたが作成したいくつかのタイプの '構造体*'にキャストし、必要なデータを持っています。あなたは通常、構造体を新しい/ mallocでmainに作成し、それをスレッド関数で必要としないときに削除/解放します。
  2. ややクリーンな選択肢は、あなたが作ったクラスのオブジェクトを '新しくする'ことです。そのクラスには、上記のvoid *をとるpublic staticメソッドを与えます。スレッドスターターとして静的メソッドを使用し、オブジェクトのアドレスを 'this'として渡します。静的にvoid型をオブジェクト型にキャストし、適切なオブジェクトに対して「開始/実行」ルーチンを呼び出します。スレッド間でより調整された解決策がない限り、スレッドルーチンから戻る前にオブジェクトを削除するようにしてください。
+0

ありがとう。私はちょうどmsdnが十分に近くにあるとは思わなかった。私はただarglistを見て、そこから行った。 – Tox1k

1
_beginthreadex(0, 0, DrawText,(void *)(hwnd, 175, 15, text, 8), 0 , &threadID); 
MSDN

によれば、3番目の引数は、引数タイプvoid*である関数へのポインタでなければなりません。あなたの場合、DrawTextは、引数がvoid*ではなく、(HWND hWnd, float x, float y, wchar_t* mybuffer, float DisplayTime)でない関数です。したがって、エラーとリンクの例を見てください。

関連する問題